- PR -

アップロードしたファイルをセッションに格納

投稿者投稿内容
CB
会議室デビュー日: 2008/12/03
投稿数: 3
投稿日時: 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,セッションが使えないとすると、一時フォルダを作成してファイルの移動を
行うくらいしか思いつかないのですが、他に良い方法はございませんでしょうか?


よろしくお願いします。






Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2009-03-24 05:31
引用:

上記の通り80kb程度のファイルをアップロードしようとすると
ObjectDisposedExceptionが発生し、破棄されたオブジェクトには
アクセスできませんと例外エラーが発生します。


まず、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サンプル集
ごん太
大ベテラン
会議室デビュー日: 2002/07/30
投稿数: 182
お住まい・勤務地: 森の中
投稿日時: 2009-03-24 08:57
親と子画面との連携動作はありませんが、下記ソースの場合、ファイルサイズでのエラーは発生せずファイルをアップロードできました。
参考になるか解りませんが。。。
コード:
Dim uploadFile, session_uploadFile As HttpPostedFile

' file-address取得 
uploadFile = Request.Files("FileUpload1")

' file-addressをセッションへ
Session("wk_uploadfile1") = uploadFile

' セッションを呼び出し再度違う変数へ
session_uploadFile = Session("wk_uploadfile1")

uploadFile.SaveAs(Server.MapPath("./") + 保存先アドレス + System.IO.Path.GetFileName(session_uploadFile.FileName))


ごん太
大ベテラン
会議室デビュー日: 2002/07/30
投稿数: 182
お住まい・勤務地: 森の中
投稿日時: 2009-03-24 09:06
追記:
先ほどのソースはFileUploadコントロールを使用しています。
会議室デビュー日: 2005/02/09
投稿数: 18
投稿日時: 2009-03-24 10:41
PostedFileは、Postされたページ内(子画面)でのみ有効だったと思います。
PostedFile.InputStreamを使って読み込んだものをSessionに保存すれば、
親画面で受け取れそうな気がします。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2009-03-24 11:52
例外はどこで発生しているんでしょうか。
間違いなく、ファイルのアップロードで発生しているんでしょうか。

気になるのは、セッションにはシリアライズできるオブジェクトしか保存できなかったんじゃないかな、というところです。
HttpPostedFileクラスはシリアライズできないんじゃないかな?

ちょっとセッションにシリアライズできるオブジェクトしか保存できない、という根拠となる情報を見つけられないのと、80k以下ではうまくいってるらしいあたりでここが問題かどうかはっきりしませんが。
CB
会議室デビュー日: 2008/12/03
投稿数: 3
投稿日時: 2009-03-24 12:32
皆様ご回答ありがとうございます。
追記としてですが、ローカルでのデバッグでは同様の現象は発生しません。
コンパイルしたモジュールをウェブサーバーに配置した後、実行したときのみ発生します。

>どっとねっとふぁん様
はい、確かにSave Asの後に例外が発生しています。
Save Asの前後にログ出力を行うようにして実行されているか確認したこともあるのですが、
Save As以降のログは出力されていませんでした。

た様>
実際にFileInputStreamによってByte配列に読み込んでみたのですが、
その後どうやって元ファイルに変換すればよいかわかりません・・・。
StreamWriterでテキスト出力では単にByte文字列が並ぶだけですし、
どのように実装すればInputStream化したファイルを元ファイルに戻すことが
できるでしょうか?

私の知識不足で皆様にはご迷惑をおかけします。よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2009-03-24 13:57
シリアライズ可能でなければならないのは、セッションモードがインプロセス以外の時です。インプロセスの時は、バイナリのまま保持します。
ですから、「ローカルでデバッグの時は可能」というのは、怪しいですね。ローカルはインプロセスで、サーバーはデータベースになっていることは考えられます。

セッションの保存する場合、問題があります。
インプロセスの場合:
メモリ使用量が、デフォルトの設定で物理メモリ量の60%を超えると、ワーカープロセスが再起動し、セッション情報が失われる。

インプロセス以外の場合:
セッション終了イベントが発生しないので、要らなくなったデータを削除するタイミングが計りづらい。

スキルアップ/キャリアアップ(JOB@IT)