web-dev-qa-db-ja.com

ASP.Net MVCを使用してファイルをアップロードする-名前を取得するがファイルストリームを取得しない、何が間違っていますか?

私の見解ではこのフォームがあります:

<!-- Bug (extra 'i') right here-----------v  -->
<!-- was: <form method="post" enctype="mulitipart/form-data" action="/Task/SaveFile"> -->
<form method="post" enctype="multipart/form-data" action="/Task/SaveFile">
<input type="file" id="FileBlob" name="FileBlob"/>
<input type="submit"  value="Save"/>
<input type="button" value="Cancel" onclick="window.location.href='/'" />
</form>

そして、私のコントローラーのこのコード:

public ActionResult SaveFile( FormCollection forms )
{
   bool errors = false;
   //this field is never empty, it contains the selected filename
   if ( string.IsNullOrEmpty( forms["FileBlob"] ) )
   {
       errors = true;
       ModelState.AddModelError( "FileBlob", "Please upload a file" );
   }
   else
   {
      string sFileName = forms["FileBlob"];
      var file = Request.Files["FileBlob"];
      //'file' is always null, and Request.Files.Count is always 0 ???
      if ( file != null )
      {
         byte[] buf = new byte[file.ContentLength];
         file.InputStream.Read( buf, 0, file.ContentLength );
         //do stuff with the bytes
      }
      else
      {
         errors = true;
         ModelState.AddModelError( "FileBlob", "Please upload a file" );
      }
   }
   if ( errors )
   {
      return ShowTheFormAgainResult(); 
   }
   else
   {
      return View();
   }
}

私が見つけたすべてのコードサンプルに基づいて、これはそれを行う方法のように思えます。小さいファイルと大きいファイルを試してみましたが、結果に違いはありません。フォームフィールドには常に、選択したファイル名と一致するファイル名が含まれ、Request.Filesコレクションは常に空です。

関係ないと思いますが、VS Development Web Serverを使用しています。私の知る限り、IISと同じファイルアップロードをサポートしています。

遅れてきて、明らかな何かを見逃している可能性があります。アドバイスをいただければ幸いです。

41
Jason Diller

冒とくの投稿に関するポリシーが何であるかはわかりませんが、問題は次のとおりです。

enctype="mulitipart/form-data"

余分なiがファイルのアップロードを停止しました。そもそもファイルを送信していないことを確認するためにFiddlerを実行する必要がありました。

次のようになります。

enctype="multipart/form-data"
50
Jason Diller

将来、この投稿に出くわす可能性のある人のために、スコットハンセルマンによるこのテーマに関する素晴らしい投稿を紹介します: テストとモック

16
Jason
var file = Request.Files[sFileName];

あるべき...

var file = Request.Files["FileBlob"];

それは言った、Request.Files.Countは1 ...である必要があります

2
Pure.Krome

エラーが見つかったのは良いことです。

補足説明として、ファイルのアクセス許可などが正しくセットアップされていない場合にわかるように、ファイル処理コードを試してみてください。

0
Todd Smith