利用AJAX與FormData來上傳多張圖片到SQL Server
前言:
最近上班遇到系統需求要做照片的批次上傳,因為以前做過一些Win Form小工具,
其中一個照片工具是做裁切、壓縮、浮水印再選擇要的照片格式最後存在特定位置,
只不過這次轉成Web Form應該不會太難才是,但是果然不是憨人想的那麼簡單。
因為公司系統的web config中設定了最大傳輸只能是4MB,也就導致如果超過4MB肯定是會失敗的!
這時候我想那我就在前端拆成一個一個檔案分次上傳就好啦!
首先我們先在要上傳檔案的頁面準備好上傳的Input與訊息框吧!(用Html的<input type='file' />也可以喔)
<asp:FileUpload class="form-control" ID="fileImages" Multiple="Multiple" runat="server" /> <ul id="uploadMsg"></ul>
接著就是準備接入一個Web Form來當接受資料的頁面。
先新增好aspx頁面,就可以在Page_Load撰寫程式啦!
注意:在Web Form回傳值跟Web Service的寫法不同,
Web Service使用 Return,
Web Form使用 Response.Write,
一開始抓不到回傳值害我以為我寫錯,Debug半天..........
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If HttpContext.Current.Request.Files.Count > 0 Then '有傳輸檔案
Dim bln As Boolean
bln = UpdPic() '上傳照片
If bln = True Then
Response.Write(HttpContext.Current.Request.Files(0).FileName + " 上傳成功!")
Response.End()
Else
Response.Write(HttpContext.Current.Request.Files(0).FileName + " 上傳失敗!")
Response.End()
End If
End If
End Sub
Public Shared Function UpdPic() As Boolean
Dim pic() As Byte = Nothing 'buffer
'取出檔案
Dim file = HttpContext.Current.Request.Files(0)
'檔案名稱
Dim name As String = System.IO.Path.GetFileNameWithoutExtension(file.FileName)
'轉成bpm縮放圖片大小
Dim ii As Image = Image.FromStream(file.InputStream)
Dim bp As Bitmap = New Bitmap(ii, 1280, 980)
Dim ms As New System.IO.MemoryStream
'轉成jpg格式
bp.Save(ms, Imaging.ImageFormat.Jpeg)
pic = ms.GetBuffer
Dim bln As Boolean = '把pic存入SQL SERVER 內我就不寫,交給各位自行處理吧
Return bln
End Function
解著就是要撰寫AJAX與FormData啦
(其實在後來我才知道原來FormData就是把頁面上想要的資料包成Form傳送,所以跟一般寫Web Service稍微不同)
$('#<%=fileImages.ClientID %>').change(function() {
//抓出檔案
var input = document.querySelector('input[type=file]'),
file;
//非圖片不傳送
for (var i = 0; i <= input.files.length - 1; i++) {
file = input.files[i];
if (!file || !file.type.match(/image.*/)) {
alert(file.name + ": 非圖片格式")
return;
}
}
$("#uploadMsg li").remove();
for (var i = 0; i <= input.files.length - 1; i++) {
file = input.files[i];
var formData = new FormData();
formData.append("id", $("#formID").val());
formData.append("file", file);
var index = 1;
$.ajax({
type: "POST",
url: "url",
data: formData,
//dataType: "json",
contentType: false,
processData: false,
success: function(data) {
//$("#uploadMsg").text("已傳送 " + i + " 個檔案");
//alert(data);
if (data.indexOf("上傳失敗") > 0) {
$("#uploadMsg").append("<li><strong style='color:red;'>" + index + ". " + data + "</strong></li>");
} else {
$("#uploadMsg").append("<li><strong>" + index + ". " + data + "</strong></li>");
}
index = index + 1;
},
error: function(err) {
alert(file.name + " :上傳期間發生錯誤!");
console.log("err:");
console.log(err);
}
});
}
})

完成品就是這樣啦!