DEXTUpload.NET Professional
menu toggle製品の説明 > ASP.NETポストバックファイルをアップロード

ASP.NETポストバックファイルをアップロード

ASP.NETは、基本的には、Webフォーム(Web Form)方式で開発をする。サーバーコントロール(Server Control)にユーザーが入力すると、イベントを通じてサーバーにデータを渡して処理し、Webフォームをレンダリングし、クライアントに送る。

このように、サーバーコントロールがイベントを処理するためにサーバーにデータを送信(Submit)することをポストバック(PostBack)と呼ばれ、これは、Webフォームで開発する基本的な方式である。

一般的に、ブラウザでファイルを転送するには、HTMLの「input」の要素の「type」属性を「file」に設定し、「form」要素の「method」属性を「post」で、「enctype '属性を「multipart/form -data」に変更する必要がある。

<form action="..." method="post" enctype="multipart/form-data">
  ...
  <input type="file" name="file1" />
  <input type="submit" value="Submit" />
</form>

これとは異なり、ポストバック環境では、二つの要素を個別に追加する必要がない。

<form id="form1" runat="server">
  ...
  <asp:FileUpload ID="file1" runat="server" />
  <asp:Button ID="btnUpload" Text="Submit" runat="server" OnClick="btnUpload_Click" />
</form>

ASP.NET基本的なファイルアップロードの処理方法ではなく、DEXTUplod.NET Professional製品を使用するには、リクエストのクエリ文字列に「use=dext」が含まれるので、次のように設定することができる。

<form id="form1" action="?use=dext" runat="server">
  ...
  <asp:FileUpload ID="file1" runat="server" />
  <asp:Button ID="btnUpload" Text="Submit" runat="server" OnClick="btnUpload_Click" />
</form>

ASPXファイルビハインドコード(cs)で接続されたボタンイベントのハンドラでファイルのアップロードを処理すればよい。

protected void Page_Load(object sender, EventArgs e)
{
}

protected void btnUpload_Click(object sender, EventArgs e)
{
    Upload();
}

「asp:FileUpload「サーバーコントロールの「ID」が「file1」であるため、ビハインドコードでは、「file1」変数名にコントロールのアクセスが可能である。

しかし、このコントロールから完全ファイルのデータを得ることができない。なぜなら「DEXTUpload.NET.FileUploadMonitorModule」オブジェクトが要求されたデータを中間に傍受からである。したがって、「file1」オブジェクトではなく、「DEXTUpload.NET.FileUpload」オブジェクトを使用してファイルを扱わなければならない。

using DEXT = DEXTUpload.NET.FileUpload;
...
private void Upload()
{
    //「System.Web.UI.WebControls.FileUpload」と「DEXTUpload.NET.FileUpload」の名前が同じなので上部に「import DEXT= DEXTUpload.NET.FileUpload; 'と宣言した。
    using (var dext = new DEXT())
    {
        // PostBackを使用している場合、フォームの名前を正確に知るのは難しい。(サーバーコントロールのIDは、フォームの名前と一対一マッチされないからである。)
        //そのため、アップロードされるファイルが一つであれば、「GetSingleFileElement」メソッドを使用して、アップロードされたファイルの情報を得ることができる。
        //もし必ずフォームの名前を使用して「FileElement」を得なければならなら、サーバーコントロールの「ClientID」を使用すればよい。
        // var element = dext.GetFileElement(file1.ClientID);
        var element = dext.GetSingleFileElement();
        if (!element.IsEmpty)
        {
            element.Save();
        }
    }
}

ポストバックを使用するときは「System.Web.UI.WebControls.FileUpload」と「DEXTUpload.NET.FileUpload」の名前が同じに注意しなければならない。