
新技術を学習する過程で、新参者は多くの場合、それほど簡単に解決できない典型的なタスクに直面します。 初心者向けの一連のMVC3記事で、このような問題の解決策を紹介します。
最近、エカテリンブルクでASP.NETについて話した開発者向けの会議で、MVC3とRazorを使用して、クライアントからサーバーへの1つ以上のファイルのアップロードを整理する方法について質問を受けました。 ASP.NET MVC3で非常に簡単かつエレガントに解決される非常に典型的なタスク。
以下は、ソースコードを含む完全なソリューションです。
マークアップ
まず、HomeコントローラーのIndex.cshtmlページのマークアップを作成しましょう。
<h2> </h2> <p> @using (Html.BeginForm("", "home", FormMethod.Post, new {enctype="multipart/form-data"})) { <input type="file" name="fileUpload" /><br /> <input type="submit" name="Submit" id="SubmitSingle" value="Upload" /> } </p> <h2> </h2> <p> @using (Html.BeginForm("", "home", FormMethod.Post, new {enctype="multipart/form-data"})) { <input type="file" name="fileUpload[0]" /><br /> <input type="file" name="fileUpload[1]" /><br /> <input type="file" name="fileUpload[2]" /><br /> <input type="submit" name="Submit" id="SubmitMultiply" value="Upload" /> } </p>
考慮すべき重要な点がいくつかあります。
- 大きなファイルを転送するには、MIMEデータ型multipart / form-dataを使用します。
- 複数のファイルアップロード要素を持つフォームを形成する場合、インデクサー[要素番号]で要素名(名前属性)を形成する必要があります。 これはASP.NET MVC3の規則です。これにより、コントローラーアクションを操作するときに要素の配列を自動的に取得できます。
コントローラーのアクションコード
Post属性といくつかのパラメーターを指定したIndexアクションを持つHomeコントローラーを追加します。
[HttpPost] public ActionResult Index(IEnumerable<HttpPostedFileBase> fileUpload) { foreach (var file in fileUpload) { if (file == null) continue; string path = AppDomain.CurrentDomain.BaseDirectory + "UploadedFiles/"; string filename = Path.GetFileName(file.FileName); if (filename != null) file.SaveAs(Path.Combine(path, filename)); } return RedirectToAction("Index"); }
ここにはいくつかの重要なポイントがあります。
- HttpPost属性を使用して、POST要求のみを処理するアクションを定義します。
- IEnumerable < HttpPostedFileBase > fileUploadパラメーターは、ユーザーによって送信されたファイルの列挙を表します。 fileUploadの名前は、インデクサー[No.]を含むものを含むフォーム要素のname属性の値と一致することに注意してください。 インデクサーが存在することで、MVC3は列挙をパラメーターに自動的に割り当てることができます。
リクエストサイズとweb.configの制限
ASP.NETには、サーバーに送信できるリクエストのサイズに制限があります。 この制限は、特にセキュリティ上の理由と、大量のリクエストを生成することでサーバーへの攻撃を簡単に防ぐために導入されました。 それでも、サーバーにファイルをアップロードするための機能を作成する場合、特にファイルがいくつかあり、サイズが大きくなる場合は、最初に制限パラメーターを目的の値に構成する必要があります。
最大リクエストサイズを制御するパラメーターはweb.configにあります。
<system.web> <!-- --> <httpRuntime maxRequestLength="10000" />
maxRequestLengthパラメーターは、リクエストが持つことができる最大サイズをキロバイト単位で指定します。 したがって、上記のコードでは、リクエストの制限は最大10メガバイトです。 つまり、ユーザーは1回の要求で約10メガバイトのサイズのファイルを転送できます。 リクエストがデータだけでなく、リクエストデータを形成するバインディングでも構成されていることのみを考慮してください。 このバインディングは小さいですが、要求のサイズに必要な制限を計算するときに考慮する必要があります。
プロジェクトのソースコード
このリンクからVisual Studio 2010の作業プロジェクトのソースコードをダウンロードできます。