• 締切済み

ファイルのアップロードとObjectDisposedException

お世話になります。 現在ASP.NETで開発を行っており、ファイルのアップロードをINPUTのFile属性のコントロールから行う処理で 一定のサイズ以上のファイルをサーバーにアップロードできないという問題に直面しています。 お手数ですが、皆様のお力をお貸し願えればと思います。 画面は以下のような構成になっています。 一覧メニュー画面 ⇒ メニューから選んだデータの詳細画面 ⇒ファイルアップロード用のポップアップ 処理の仕様としては (1)ポップアップを開き、FileInputコントロールからアップロードしたいファイルを選択し、 (最大5つアップロードできる仕様となっています。小さなポップアップに FileInputコントロールが5つ並んでいるイメージです) ポップアップのOKボタンが押されるとポップアップ画面が閉じます。 ※この地点ではサーバー側にファイルはアップロードされません。 (2)詳細の画面でデータを入力後、確定ボタンを押した地点で ポップアップに入力されたファイルをサーバー側にアップロードします。 (1)から(2)に遷移する際、ポップアップで入力されたファイルのパスを保持するため、 DatatableのインスタンスにHtmlInput型のカラムを作成し、 ファイル名、ファイルパス、ポストされたファイルの情報を保持しています。 その後、ポップアップの画面が閉じると同時に、セッションにデータテーブルを格納し、 詳細画面の確定ボタン押下時にセッションからデータテーブルを取り出し、HttpPostedFileとして宣言した変数に該当するカラムを格納し、 アップロードしています。 この際、ローカルでデバッグする場合には特に問題はないのですが、 Webサーバーにてテストを行うと100kb前後のファイルをアップロードしようとした際に ObjectDisposedExceptionが発生し、アプリケーションが落ちます。 ------------------------------------------------ Dim datatable As New DataTable datatable = Session.item("ポップアップで入力されたFileInputのPostedFileを保持したデータテーブル") For i as integer = 0 to datatable.rows.count -1 Dim posted As HttpPostedFile = datatable.rows(i)("PostedFileが格納されたカラム") If Not posted.FileName = "" Then posted.SaveAs( _ "c:\UploadedFiles\" _ & System.IO.Path.GetFileName(posted.FileName)) End If Next ----------------------------------------------- このような形でコーディングしています。 ObjectDisposedExceptionが発生する地点は恐らくはSave Asの直後です。 (Webサーバーで動かしているためデバッグができません・・・) Save Asの直後に数秒のウェイトを置くとアップロードできるケースも 確認できました。 (ファイルのアップロードが終了する前にオブジェクトが破棄されるために発生しているのかな・・・とも思いましたがはっきりと特定はできていません) 長くなりましたが質問です。 (1)データテーブルにPostedFileを格納し、セッションに入れて データを持ちまわることはできるものなのでしょうか? ⇒50kb前後のファイルならアップロードができることから、 これ自体は問題ないのでしょうが、何か問題があればお知恵をお貸し下さい。 (2)アップロードしたファイルがアップロード完了した。という確認を取ることは可能でしょうか? ⇒サーバー上のファイルサイズとPostedFileのサイズを比較し、 同一サイズなら終了という手段も考えましたが、 サーバー上のアップロードしているファイルはロックされているせいか サイズを読み取ることができません。 ロック状態でも、(または他に何か原因があるのかもしれませんが・・) データサイズが読み取れる手段があればご教示願います・・・。 以上です。よろしくお願いします。

みんなの回答

noname#259269
noname#259269
回答No.1

>ポップアップのOKボタンが押されるとポップアップ画面が閉じます。 >※この地点ではサーバー側にファイルはアップロードされません。 まず、ここ↑が事実と異なる気がしますが。 FILE INPUT コントロールのある画面で、コントロールにファイル名を指定して、サーバにPOST(Postback)すると、 ファイル本体がサーバにその時点で送信されている筈です。デバッグ実行やネットワークモニタなどでよく確認してみてください。 サーバコントロールのプロパティである PostedFile のライフタイムは当然そのページ内でのみ有効ですから、質問内容の(1)は問題ありというのが回答になります。 つまり、ポップアップを閉じる時点でファイルをどこかにワーク保存し、親画面の指示に従ってそのファイルを正式に保存または破棄するべきです。 親画面がブラウザの閉じるボタンで閉じられたり、急にクライアントOSが死んだ時の為に、ワークのごみクリアの措置も必要でしょう。 (2)ファイルが大きい場合は、PostedFile.InputStreamを使って少しずつ読み込みながら書き出します。

natsu_0124
質問者

お礼

ご回答ありがとうございました。確かにPOSTされたファイルは サーバー上に送信されているようでした。 もう少し色々試して見ます。ありがとう御座いました(^-^

関連するQ&A