Sweets Junkie

もぅマヂ無理。ムズかしぃコト。。。ぉぼぇてらんなぃから。。。ブログかコ。。。デザィンみづらくてぇ。。。それどころじゃなぃ。。。

【C#】【html5】.NET Framework 4 で複数ファイルアップロード

今まではFlashなどを使わなければ実現不可能だった複数ファイルアップロードですが、html5ではinput type="file"にmuliple属性を付けるだけでできるようになりました。

<input type="file" name="example" multiple>


この機能はもちろん.NETでもサポートされており、.NET4.5で追加された機能を使えば簡単に実装できます。
しかし、私の会社の環境は.NET4.0…。なんだ結局複数ファイルアップロードできないのかよ!!と思いきやあっさりできたので忘備しておきます。

以下は.NET4.5で実装した例。

■html

<asp:FileUpload ID="FileUpload" runat="server" AllowMultiple="true"/>

C#

protected void btnUpload_Click(object sender, EventArgs e)
{
	if(FileUpload.HasFiles)
	{
		foreach(var file in FileUpload.PostedFiles)
		{
			Response.Write(file.FileName + " <br />");
		}
	}
}


そして.NET4.0で実装した例。

■html

<asp:FileUpload ID="FileUpload" runat="server"/>

JavaScript(jQuery使用)

/*
DOMロード時の処理を実装する。
*/
$(document).ready(function () {
	// ファイルアップロードフォームの初期化
	// multiple属性を設定
	$('#<%=FileUpload.ClientID %>')
		.attr("multiple", "multiple");
});

C#

protected void btnUpload_Click(object sender, EventArgs e)
{
	HttpFileCollection files = Request.Files;
	for (int i = 0; i < files.Count; i++)
	{
		Response.Write(files[i].FileName + " <br />");
	}
	
}

JavaScriptで属性を設定するあたりはエレガントさに欠けるけど、それで複数ファイルアップロードが実現できるなら安いものよ!
プライドよりも実益!可読性より仕様実現!

ちなみに、html5を使用した複数ファイルアップロードですが、Win版のSafari5.1系では動作しません。
理由はWin版Safariの不具合。Mac版だと動く(確認済)。古いWin版Safariでも動く。
なんじゃそりゃーって感じですが、動かないものは仕方がないので、うちのツールでは使用しないように注意書きして済ましました。
一般ユーザーが使用する可能性があるなら、Win版Safariの場合は普通のファイルアップロードに切り替えるのが良いかもしれないですね。