[JQUERY]ASP.NET利用AJAX與FormData來上傳多張圖片到後端

利用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);
                }
            });

        }

        })

完成品就是這樣啦!