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」の名前が同じに注意しなければならない。