• 締切済み

ファイルのアップロードと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

  • ASP.NET C#でのファイルアップロード

    VS2005 ASP.NET C# のファイルアップロードについて教えてください。 初めまして。 VS2005 ASP.NET C#でファイルをアップロードさせたいのですが、アップロード先をネットワーク越しのサーバのディレクトリにしたいのですが、エラーが出てうまくいきません。お手数ですが、どうやればいいのか、教えていただけないでしょうか? HttpPostedFile posted = Request.Files["userfile"]; if (posted.FileName != "") { posted.SaveAs( "\\10.0.0.18\\ETC\\" ← このディレクトリ指定がうまくいきません。 + System.IO.Path.GetFileName(posted.FileName)); } else { ClientScript.RegisterClientScriptBlock(this.GetType(), "警告", "<script language='JavaScript'> alert('ファイル名が入力されていません') </script>"); return; }

  • ファイルアップロードしたものをセッションに保存

    $_FILESでアップロードされた画像ファイルをセッションに保存し、 確認画面で確定されるとファイルとして保存するという処理を 作成したいのですが、 どのようにすればいいのでしょうか? ファイルサイズは20MBくらいです。

    • 締切済み
    • PHP
  • ファイルのアップロード

    お世話になります。 ファイルをbasp21コンポーネントを使用してサーバーにアップロードしたいのですが、ファイルの数とサイズが大きいため、Cドライブでは足りなくなる可能性があり、ネットワーク上のファイルサーバーにアップしようとしたのですが、できませんでした。 ネットワークドライブを割り当ててあり、一応Tドライブとなっているのですが、ネットワーク上ではやはり無理ですよね。外付けのHDDなら、できるでしょうか?

  • ファイルの開き方について

    1 2 3 4 5 6 上記のように文字と文字の間が半角スペース一つで区切られている ファイルを配列に Datatable(1)=1 Datatable(2)=2 Datatable(3)=3 Datatable(4)=4 Datatable(5)=5 Datatable(6)=6 のように格納するにはどうすればよいのでしょうか。 Open MyPath & "DataBaseJ.dat" For Input As #1 Do Until EOF(1) i = i + 1 Input #1, DB(i) Loop Close #1 上記のようにすると 1 2 3 4 5 6 と一行が Datatable(1)=1 2 3 4 5 6 と格納されてしまいます。 「,」で区切っているとそれぞれが分かれて格納されてくれるのですが… よろしくお願いします。

  • ファイルアップロードの進捗状況

    4つのファイルを選択しサーバーにアップロードする画面を 作成しています。 ファイルサイズが大きいので進捗状況を 「1/4」のように画面に出力させておきたいと考えています。 しかしどうやったらできるのかさっぱりわかりません。 よろしくお願いします。

  • ファイルのアップロードについて、

    ファイルをアップロードしたら、そのファイルはサーバ名の後に、スラッシュを 打ってからファイル名ですよね・・・・?ファイル名をコピーアンドペーストして サーバ名のあとに貼り付けてブラウザで見てみたら404ってでてくるんです、 でもアップロードソフトでアップ完了ってでてるし・・・・ OSはWINDOWSMEで、アップロードソフトはairIを使いました どの辺が間違っているのでしょうか?教えて下さい

  • CGIを使用してブラウザからファイルをアップロード

    CGI(perl)を使用して、ユーザー側からサーバーへファイルのアップロードをしたいと思います。 いろいろサンプルをみてみたのですがよくわからず…。 なのでごくシンプルなソースを教えていただきたいのです。 サイズが大きいのはアップさせないようにするとか、そういうものも一切なくして、ただ単純に サーバーへアップロードさせるだけのものが知りたいです。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 大きいサイズのファイルのアップロード

    ファイルのアップロードについて教えてください。 OSはLinuxです。 php.iniのupload_max_filesizeは10Mを指定してあります。 そこで7Mくらいのデータをアップロードしようとすると ファイルの存在チェックでファイルが見つかりません。となってしまいます。 小さいサイズのファイルでは問題はありません。 サーバーはApacheを使用しています。 また、Windowsで同じ設定で同じファイルのアップロードは できます。 なにか原因となるものがありましたら、 是非教えてください。 よろしくお願いします。

    • 締切済み
    • PHP
  • ファイルアップロード IEではなぜできない

    環境 Windows7 Webサイトからある申し込みをする際に、そのサイト内のフォームにあるファイルアップロード項目から身分証明書の画像をアップロードしようとすると、IE11ではファイルを選択する前のファイル一覧画面が出てきたところで「Internet Explorerは動作を停止しました」というポップアップ表示が出て、止まってしまいます。同じことをGoogle Chromeからこのサイトに入って行うと、こちらはすんなり画像を取り込んでアップロード送信ができます。なぜIEではできないのでしょうか?

  • アップロードするとファイルサイズが大きくなる

    ホームページにファイルをアップロードすると、PCで確認したサイズより大きくなります。 結果、借りている容量を超えてしまい途中でアップできなくなります。 例えば、プロバイダーに90Mbを借りているところへエクスプローラのプロパティで  サイズが77.5Mbディスク上のサイズが103Mbのフォルダー内の物を サーバーにアップすると  サイズが77.5Mbでは上がらず、59Mbにまでサイズダウンして何とか上がります。  (ディスク上のサイズはファイルシステムの関係もあり無視します) 77.5Mbの物がアップすると90Mbを超える・・・、借りている容量も少ないので何とかしたい ・アップしてもサイズが増えない様にできないだろうか ・写真等はjpg、gifしかサーバー側が対応していないようですが、他に方法はないのだろうか 何かうまい方法があればアドバイスをお願いします  

専門家に質問してみよう