ASP.NET MVCファイルのアップロード
HTML「Form」タグを使用してファイルをアップロードするには、「Form」タグの「method」属性は「post」、「enctype」 '属性は「multipart/form-data」に設定する必要がある。
「action」属性の値にアップロードするパスを設定する必要があり、DEXTUpload.NET Professionalコンポーネントを使用するには、「use=dext」クエリ文字列がパスに含まなければならない。
純粋なHTML表現は次の通りである。
<form action="/Sample/UploadSingle?use=dext" method="post" enctype="multipart/form-data"> <input type="file" name="file1" /> <input type="submit" value="Submit" /> </form>
ASP.NET MVC環境でRazorビューエンジンを使用する場合は、次のように表現することができる。
@using (Html.BeginForm("UploadSingle", "Sample", new { use = "dext" }, FormMethod.Post, new { enctype = "multipart/form-data" })) { <input type="file" name="file1" /> <input type="submit" value="Submit" /> }
例では、ファイルのアップロードを処理する「SampleController」の「UploadSingle」メソッドは、次のとおりである。
[UseDEXT] public ActionResult UploadSingle([Bind(Prefix = "file1")] DEXTPostedFile file) { //ファイルが空の場合「file」パラメータは、「null」になる。 if (file != null) { //「file」オブジェクトの「SaveAs」メソッドを使用することができますが、「file.Element」属性を使用すると、より多くの機能を提供する「FileElement」オブジェクトにアクセスすることができる。 file.Element.Save(); } ... }
ASP.NET MVC環境では、「HttpPostedFileBase」クラスのオブジェクトからアップロードされたファイルにアクセスするようになっている。しかしDEXTUpload.NET Professionalコンポーネントを使用するには、「HttpPostedFileBase」ではなく「DEXTPostedFile」クラスを使用して、アップロードされたファイルの情報を受けなければならない。
「UseDEXTAttriubte '属性クラスは、「HttpPostAttribute」と同じですが、「HttpDEXTAttriubte」を使用すると、「use = dext「存在の有無も検査する。必ず「UseDEXTAttriubte」を使用する必要はありません代わりに「HttpPostAttribute」を用いてもよい。しかし、製品で提供される一時ファイルの削除機能を使用するには、「UseDEXTAttribute」を使用する。
ASP.NET MVC環境でDEXTUpload.NET Professional製品を使用するには、プロバイダを登録する必要がするが、プロバイダを登録しない場合進ん「UploadSingle」アクションメソッドで「file」パラメータは、常に「null」となるため、「null」を参照検査をせずに「file.Element」プロパティを呼び出すと「NullReferenceException」例外が発生する。「file」が「null」になる理由は、マルチパートデータのファイルフォームパーツを「DEXTPostedFile」オブジェクトにバインドする過程がないからである。そのため、ファイルのデータをバインドするために「DEXTUpload.NET.Mvc.FileUploadValueProviderFactory」プロバイダを登録する必要がある。(プロバイダを正しく登録したとしても、ファイルのフォームパーツが空の場合「file」パラメータはnullになる。)
プロバイダの登録は「Global.asax」である。
# Global.asax ... protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // ASP.NET MVC環境でDEXTUpload.NET Professionalコンポーネントを使用するためのプロバイダを前に追加する。 ValueProviderFactories.Factories.Insert(0, new FileUploadValueProviderFactory()); }
もし「HttpPostedFileBase」形式のパラメータを使用したい場合は、「use=dext」クエリ文字列がない要求のみアップロードが正常に処理がされることを留意しなければならない。
もし複数のファイルを同時に受信するコントローラのメソッドを次のような形で扱えばされる。
[UseDEXT] public ActionResult UploadMultiple(List<DEXTPostedFile> files) { //一つのファイルのみを受信するとき「DEXTPostedFile」時引数が「null」であるが、 //多数個を受けるとき「List<T>」ジェネリックオブジェクトで受けるため、「files」は「null」ではない。 //ただし「files」リストオブジェクトに登録された要素は、「null」を持つことができていることに留意しなければならない。 files.Where(f => f != null).Select(f => { f.Element.Save(); ... }); ... }