QA@IT
«回答へ戻る

回答を投稿

普通の html の input type="file" ... を使った場合と、サーバーコントロール(input type="file" runat="server" ... または FileUpload)を使った場合とでは ASP.NET がレンダリングする html ソースが違ってきます。そこがうまくいかなかった原因のようです。

具体的には以下の通りです。

(1) <input id="File1" type="file" name="user1" />

上記の場合、ASP.NET がレンダリングする html ソース以下のようになります。("005-FileUpload2.aspx" は自分が検証に使ったページのファイル名です)

<form method="post" action="005-FileUpload2.aspx" id="form1">

<input id="File1" type="file" name="user1" />

ファイル選択後、Button クリックでサーバーに送信されるデータは:

user1=0_1133062.jpg

結果、サーバー側で Request.Files["user1"] を取得すると null になります。

(2) <input id="File1" type="file" name="user1" runat="server" />

上のコードの場合(runat="server" 属性を追加)、ASP.NET がレンダリングする html ソースでは、以下のように、form 要素に enctype="multipart/form-data" が追加されます。また、input type="file" ... の name 属性に設定した "user1" は "File1" に変わり、Master Page を使うと ContentPlaceHolder 名などが追加され、さらに変わって以下のようになります。

<form method="post" action="005-FileUpload2.aspx" id="form1" enctype="multipart/form-data">

<input name="ctl00$ContentPlaceHolder1$File1" type="file" id="ContentPlaceHolder1_File1" />

ファイル選択後、Button クリックでサーバーに送信されるデータは:

Content-Disposition: form-data; name="ctl00$ContentPlaceHolder1$File1"; filename="0_1133062.jpg"
Content-Type: image/jpeg

と期待した形式になりましたが、neme 属性の設定値が "user1" から "ctl00$ContentPlaceHolder1$File1" に変わってしまったので、Request.Files["user1"] では取得できません(null になる)。

Request.Files["ctl00$ContentPlaceHolder1$File1"] または Request.Files[File1.UniqueID] なら取得できますが、将来も命名規則が変わらないという保障はないでしょうから、そうすることはお勧めできません。

結局、ASP.NET Web Forms アプリを作っているなら、input type="file" ではなくて、FileUpload サーバーコントロールを使うことをお勧めします。先にも書きましたが、以下の MSDN ライブラリを見てください。サンプルコードも記載されています。

FileUpload クラス
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.fileupload(v=vs.110).aspx

普通の html の input type="file" ... を使った場合と、サーバーコントロール(input type="file" runat="server" ... または FileUpload)を使った場合とでは ASP.NET がレンダリングする html ソースが違ってきます。そこがうまくいかなかった原因のようです。

具体的には以下の通りです。

(1) ```<input id="File1" type="file" name="user1" />```

上記の場合、ASP.NET がレンダリングする html ソース以下のようになります。("005-FileUpload2.aspx" は自分が検証に使ったページのファイル名です) 

```
<form method="post" action="005-FileUpload2.aspx" id="form1">

<input id="File1" type="file" name="user1" />
```

ファイル選択後、Button クリックでサーバーに送信されるデータは:

user1=0_1133062.jpg

結果、サーバー側で Request.Files["user1"] を取得すると null になります。


(2) ```<input id="File1" type="file" name="user1" runat="server" />``` 

上のコードの場合(runat="server" 属性を追加)、ASP.NET がレンダリングする html ソースでは、以下のように、form 要素に enctype="multipart/form-data" が追加されます。また、input type="file" ... の name 属性に設定した "user1" は "File1" に変わり、Master Page を使うと ContentPlaceHolder 名などが追加され、さらに変わって以下のようになります。

```
<form method="post" action="005-FileUpload2.aspx" id="form1" enctype="multipart/form-data">

<input name="ctl00$ContentPlaceHolder1$File1" type="file" id="ContentPlaceHolder1_File1" />
```

ファイル選択後、Button クリックでサーバーに送信されるデータは:

Content-Disposition: form-data; name="ctl00$ContentPlaceHolder1$File1"; filename="0_1133062.jpg"
Content-Type: image/jpeg

<0_1133062.jpg の中身>

と期待した形式になりましたが、neme 属性の設定値が "user1" から "ctl00$ContentPlaceHolder1$File1" に変わってしまったので、Request.Files["user1"] では取得できません(null になる)。

Request.Files["ctl00$ContentPlaceHolder1$File1"] または Request.Files[File1.UniqueID] なら取得できますが、将来も命名規則が変わらないという保障はないでしょうから、そうすることはお勧めできません。

結局、ASP.NET Web Forms アプリを作っているなら、input type="file" ではなくて、FileUpload サーバーコントロールを使うことをお勧めします。先にも書きましたが、以下の MSDN ライブラリを見てください。サンプルコードも記載されています。

FileUpload クラス
http://msdn.microsoft.com/ja-jp/library/system.web.ui.webcontrols.fileupload(v=vs.110).aspx