[C#][ASP.net] 使用 FileReader.readAsArrayBuffer 做到多檔上傳
2013-05-27
上傳多檔的解決方法很多,不管是用Flash 或是啥技術,都是可以做到多檔上傳,
套件也是超級的多,今天做一個很簡單的範例 其中使用到HTML5 File API 的部分,參考網址:http://www.w3.org/TR/FileAPI/
因為檔案上傳,還包含Server端的程式撰寫,網路上較多關於PHP 方法,目前我會用到ASP.net 部分,所以就筆記一下,
當然這很簡陋,改良空間也很大,但是需要的人可以繼續改寫下去..
文章案例,是需要做一個多檔圖片上傳功能.
首先,我們看看 Server 端的部分,我們建立一個upload.ashx 來負責收檔案下來存取..
這隻程式很簡單,需要傳一個參數近來 就是filename
這然這點你之後可以改寫,這樣的話收到的檔案預設就會存到
/images/[filename].jpg
using System;
using System.IO;
using System.Web;
namespace TestMutiUpload
{
/// <summary>
/// Summary description for upload
/// </summary>
public class upload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
//如果沒有回傳指定檔名就回傳錯誤
if (string.IsNullOrEmpty(context.Request["filename"]))
{
context.Response.Write("error:filename");
return;
}
//暫存在images檔案夾下面,如果沒有此檔案夾就建立
if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + "images\\"))
{
Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + "images\\");
}
//寫入檔案
File.WriteAllBytes(AppDomain.CurrentDomain.BaseDirectory + "images\\" + context.Request["filename"] + ".jpg", StreamToBytes(context.Request.InputStream));
//回傳寫入的檔名
context.Response.Write(context.Request["filename"]);
}
/// <summary>
/// 將Stream 轉成 Byte[]
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
private byte[] StreamToBytes(Stream stream)
{
stream.Position = 0;
var buffer = new byte[stream.Length];
for (int totalBytesCopied = 0; totalBytesCopied < stream.Length; )
totalBytesCopied += stream.Read(buffer, totalBytesCopied, Convert.ToInt32(stream.Length) - totalBytesCopied);
return buffer;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
再來,我們來看HTML的部分
<input type="file" multiple="multiple" id="input_chooseFiles" data-id="fileUpload" />
<div id="div_Result"></div>
一個id 為 input_chooseFiles 的 input 負責做選取圖片們(多檔),之後上傳成功後會將結果append 到 div_Result 之中
javascript 部分:
<script>
//產生隨機檔名
//如果有特別需求可以改寫成從Server去取
function GetGUID() {
var res = '';
for (var i = 1; i <= 8; i++) {
res += Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return res;
};
//將以上傳的append 到顯示結果的DIV
function ShowImage(filename) {
$('#div_Result').append("<img src='/images/" + filename + ".jpg' style='width:100px' />");
}
//透過AJAX POST 到upload.ashx
function SendFileToServer(filename, filecontent) {
$.ajax({
type: "POST",
url: "/upload.ashx?filename=" + filename,
dataType: 'text',
cache: false,
processData: false,
data: filecontent,
success: function (data) {
ShowImage(data);
}
});
}
$('#input_chooseFiles').change(function (evt) {
if (evt.target.files.length > 0) {
for (var i = 0; i < this.files.length; i++) {
var file = this.files[i];
var reader = new window.FileReader();
reader.onload = function (rResult) {
var filename = GetGUID();
SendFileToServer(filename, rResult.target.result);
};
reader.readAsArrayBuffer(file);
};
}
});
</script>
結果:
測試過 IE10 , Waterfox , Chrome 都正常
下面有檔案,可以自行改寫,有任何問題或建議,在跟我說搂..
標籤:
ASP.net
,
C#
,
Javascript
-- Yesterday I wrote down the code. I bet I could be your hero. I am a mighty little programmer. 如果這篇文章有幫助到您,簡單留個言,或是幫我按個讚,讓我有寫下去的動力...