DEXTUpload.NET Professional
menu toggle製品の説明 > ASP.NET MVCファイルのアップロード

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();
        ...
    });
    ...
}