実現したいこと
ASP.NET MVCにて、
以下の様なWebページ遷移・動作、またはそれと同等な機能を実装としたいと考えております。
<ファイルをアップロードするページ>
・ファイル選択ダイアログより、サーバにアップロードするファイルを選択し、
”確認画面へ”ボタン押下で<アップロードするファイルを確認するページ>へ遷移。
↓
<アップロードするファイルを確認するページ>
・前ページで選択されたファイルを一覧表示し、
”アップロード”ボタンが押下されると、サーバにファイルをアップロードし、
<アップロード完了ページ>へ遷移。
”戻る”ボタンが押下されると、サーバにファイルをアップロードせずに、
<ファイルをアップロードするページ>へ遷移。
↓
<アップロード完了ページ>
。"アップロード完了しました"の表示。
発生している問題・エラーメッセージ
<アップロードするファイルを確認するページ>から、”アップロード”ボタンを押下すると、以下のエラーが表示されます。
System.ObjectDisposedException: 閉じているファイルにはアクセスできません。
該当のソースコード
使用するモデルは以下の様に定義しています。
C#
1public class UploadData { 2 public IList<HttpPostedFileBase> UploadFilesForUploading { get; set; } 3}
コントローラは以下の様に定義しました。
<ファイルをアップロードするページ>から<アップロードするファイルを確認するページ>へのPOST時のアクションメソッド
C#
1[HttpPost] 2public ActionResult Upload(UploadData uploadData) { 3 if (ModelState.IsValid) 4 //入力データをセッションに格納 5 Session["tempUploadData"] = uploadData; 6 7 return View("Details", uploadData); 8}
<アップロードするファイルを確認するページ>から<アップロード完了ページ>へのPOST時のアクションメソッド
C#
1[HttpPost] 2public ActionResult Details(string process) { 3 //セッションから入力データを取得 4 var uploadData = new UploadData(); 5 uploadData = Session["tempUploadData"] as UploadData; 6 7 //ファイルアップロード 8 foreach (var uploadFile in uploadData.UploadFilesForUploading) { 9 uploadFile.SaveAs(uploadFileForServer); //ここでエラー 10 } 11 12 return RedirectToAction("Complete"); 13}
試したこと
HTTPがステートレスなプロトコルであることから、今回のように3ページを渡る場合は、
SessionまたはTempDataを利用する必要があるものと考え、上記のような設計としましたが、
上記エラーが発生することから、Sessionはアップロードファイル自身を含むことはできないものと認識しました。
その為、<ファイルをアップロードするページ>から<アップロードするファイルを確認するページ>へのPOST時のアクションメソッド内に、
サーバへのファイルアップロード処理を実装し、
<アップロードするファイルを確認するページ>から<アップロード完了ページ>へのPOST時のアクションメソッド内に、
”アップロード”ボタン押下時は、何もせず、
”戻る”ボタン押下時に、サーバへアップロードしたファイルを削除する、
という処理を実装したところ、正しく動作しました。
しかし、サーバへのファイルアップロード処理を行い、<アップロードするファイルを確認するページ>を表示しているときに、
ユーザ側でブラウザを閉じてしまった場合、サーバにアップロードしたファイルが削除されず残ってしまいます。
この同期をとる為に、<アップロードするファイルを確認するページ>のセッションのタイムアウト時間を設定しておき、
<ファイルをアップロードするページ>に、現時刻から設定したセッションタイムアウト時間より以前にアップロードされたファイルがあれば削除する、といった処理を追加することも視野に入れておりますが、処理を極力シンプルにしたいと考えております。
###開発環境
●環境
・統合環境:Visual Studio 2019
●プロジェクト
・使用言語:C#(.NET Framework 4.6.1)
・種別:ASP.NET MVC 5 Webアプリケーション
回答1件
あなたの回答
tips
プレビュー