- - PR -
アップロードしたファイルをセッションに格納
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-03-24 00:43
お世話になります。
開発を始めて間もありませんので、 言葉足らずなところがあるかもしれませんが、ご容赦頂ければと思います。 皆様のお知恵をお貸し下さい。 現在ASP.NET VisualBasic2005 .NETFramework2.0で開発を行っています。 親画面からポップアップを表示し、その画面内にある複数個のFileInputコントロールから アップロードするファイルを選択。その後ポップアップ画面を閉じたあと 親画面の確定ボタンを押下時点でサーバー上のフォルダにファイルが保存される。 以上のような仕組みを作成できないかと言われています。 制限としては ・ポップアップ画面からFile Inputを通してPostされたファイルは Tempフォルダ等の一時的なワークに保存することはしたくない。 という条件があります。 短絡的に思いついたのは、Postされたファイルをセッションに保存し、 確定の地点でセッションからファイルを呼び出し、保存できないかと思いましたが、 ある一定サイズを超えると何故かファイルのアップロードができなくなります。 (具体的には80kb前後です。それ以下のファイルであればウェブサーバーへの アップロードができることは確認しました。) コードの一例としては ・子画面 ================== Protected Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click Try Session.item(ChildWindow1) = Me.fileUpload1.PostedFile Session.item(ChildWindow2) = Me.fileUpload2.PostedFile Session.item(ChildWindow3) = Me.fileUpload3.PostedFile ・ ・ Catch ex as exception 〜例外処理〜 End Try End Sub ・親画面 =================== Protected Sub btnExecute_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnExecute.Click Try Dim postedFile As HttpPostedFile Me.fileUpload.PostedFile = Session.item(ChildWindow1) posted.SaveAs( _ "保存先のパス"& System.IO.Path.GetFileName(posted.FileName)) ・ ・ ポップアップのInputコントロールの数繰り返し ・ ・ Catch ex as exception 〜例外処理〜 End Try End Sub IISの設定でASPNETユーザーに書き込み権限も与えており、 ファイルをアップロードできる環境は整っていると思われるのですが、 上記の通り80kb程度のファイルをアップロードしようとすると ObjectDisposedExceptionが発生し、破棄されたオブジェクトには アクセスできませんと例外エラーが発生します。 そこで質問なのですが、 1,数百kb程度のファイルを一時的にセッションに格納し、 親画面の確定後にファイルを保存するという処理はできないものなのでしょうか? ##実際には数十kb程度のファイルであれば正常に保存が行われているので できるといえばできるのでしょうが、何故このようなエラーが発生するのでしょうか? 2,セッションが使えないとすると、一時フォルダを作成してファイルの移動を 行うくらいしか思いつかないのですが、他に良い方法はございませんでしょうか? よろしくお願いします。 | ||||
|
投稿日時: 2009-03-24 05:31
まず、80KBのファイルがアップロードできない原因を究明した方がよろしいかと。 デフォルトが4MBでMaxが2GBのようですからアップロードできるはずですよね。 以下のサイトが参考になるのでは・・・ http://msdn.microsoft.com/en-us/library/aa479405.aspx http://www.bloggingdeveloper.com/post/Limiting-the-File-Upload-Size-in-ASPNET.aspx _________________ ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集 | ||||
|
投稿日時: 2009-03-24 08:57
親と子画面との連携動作はありませんが、下記ソースの場合、ファイルサイズでのエラーは発生せずファイルをアップロードできました。
参考になるか解りませんが。。。
| ||||
|
投稿日時: 2009-03-24 09:06
追記:
先ほどのソースはFileUploadコントロールを使用しています。 | ||||
|
投稿日時: 2009-03-24 10:41
PostedFileは、Postされたページ内(子画面)でのみ有効だったと思います。
PostedFile.InputStreamを使って読み込んだものをSessionに保存すれば、 親画面で受け取れそうな気がします。 | ||||
|
投稿日時: 2009-03-24 11:52
例外はどこで発生しているんでしょうか。
間違いなく、ファイルのアップロードで発生しているんでしょうか。 気になるのは、セッションにはシリアライズできるオブジェクトしか保存できなかったんじゃないかな、というところです。 HttpPostedFileクラスはシリアライズできないんじゃないかな? ちょっとセッションにシリアライズできるオブジェクトしか保存できない、という根拠となる情報を見つけられないのと、80k以下ではうまくいってるらしいあたりでここが問題かどうかはっきりしませんが。 | ||||
|
投稿日時: 2009-03-24 12:32
皆様ご回答ありがとうございます。
追記としてですが、ローカルでのデバッグでは同様の現象は発生しません。 コンパイルしたモジュールをウェブサーバーに配置した後、実行したときのみ発生します。 >どっとねっとふぁん様 はい、確かにSave Asの後に例外が発生しています。 Save Asの前後にログ出力を行うようにして実行されているか確認したこともあるのですが、 Save As以降のログは出力されていませんでした。 た様> 実際にFileInputStreamによってByte配列に読み込んでみたのですが、 その後どうやって元ファイルに変換すればよいかわかりません・・・。 StreamWriterでテキスト出力では単にByte文字列が並ぶだけですし、 どのように実装すればInputStream化したファイルを元ファイルに戻すことが できるでしょうか? 私の知識不足で皆様にはご迷惑をおかけします。よろしくお願いします。 | ||||
|
投稿日時: 2009-03-24 13:57
シリアライズ可能でなければならないのは、セッションモードがインプロセス以外の時です。インプロセスの時は、バイナリのまま保持します。
ですから、「ローカルでデバッグの時は可能」というのは、怪しいですね。ローカルはインプロセスで、サーバーはデータベースになっていることは考えられます。 セッションの保存する場合、問題があります。 インプロセスの場合: メモリ使用量が、デフォルトの設定で物理メモリ量の60%を超えると、ワーカープロセスが再起動し、セッション情報が失われる。 インプロセス以外の場合: セッション終了イベントが発生しないので、要らなくなったデータを削除するタイミングが計りづらい。 |