通过$.Ajax()方式上传文件,使用FormData进行Ajax请求,应注意 Form表单上传大文件,无法进入后台Action,页面提示404.

首先, 在 http 中传输文件的问题。起初,http 协议中没有上传文件方面的功能,直到 rfc1867 为 http 协议添加了这个功能。当然在 rfc1867 中限定 form 的 method 必须为 POST , enctype = “multipart/form-data” 以及.
后面有boundary以及一串字符,这是分界符,后面的一堆字符串是随机生成的,目的是防止上传文件中出现分界符导致服务器无法正确识别文件起始位置(因为对于上传文件,我们没有在使用原有的 http 协议,所以 multipart/form-data 请求是基于 http 原有的请求方式 post 而来的).

与post区别

 (1)请求头的不同,对于上传文件的请求,contentType = multipart/form-data是必须的,而 post 则不是,毕竟 post 又不是只上传文件

(2)请求体不同。这里的不同也就是指前者在发送的每个字段内容之间必须要使用分界符来隔开,比如文件的内容和文本的内容就需要分隔开,不然服务器就没有办法正常的解析文件,而后者 post 当然就没有分界符直接以 name = "value"的形似发送。

  不过传统的form表单提交会导致页面刷新,但是在有些情况下,我们不希望页面被刷新,用ajax

ajax

$.ajax({  

     url : "http://localhost:8080/STS/rest/user",  

     type : "POST",  

     data : $( '#postForm').serialize(),  //对form表单进行序列化,从而将form表单中的所有参数传递到服务端。

     success : function(data) {  

          $( '#serverResponse').html(data);  

     },  

     error : function(data) {  

          $( '#serverResponse').html(data.status + " : " + data.statusText + " : " + data.responseText);  

     }  

});  

上述方式,只能传递一般的参数, 上传文件的文件流是无法被序列化并传递的。
不过如今主流浏览器都开始支持一个叫做FormData的对象,有了这个FormData,我们就可以轻松地使用Ajax方式进行文件 上传 了。

1、FormData对象

Mozilla上的介绍的,XMLHttpRequest Level 2添加了一个新的接口FormData.利用FormData对象,我们可以通过方法来异步的提交这个”表单”.比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二进制文件.

所有主流浏览器的较新版本都已经支持这个对象了,比如Chrome 7+、Firefox 4+、IE 10+、Opera 12+、Safari 5+。之前都是用原生js的XMLHttpRequest写的请求

2、XMLHttpRequest方式

var oData = new FormData(document.forms.namedItem("fileinfo" ));  

oData.append( "CustomField", "This is some extra data" );  

var oReq = new XMLHttpRequest();  

oReq.open( "POST", "stash.php" , true );  

oReq.onload = function(oEvent) {  

      if (oReq.status == 200) {  

          oOutput.innerHTML = "Uploaded!" ;  

     } else {  

          oOutput.innerHTML = "Error " + oReq.status + " occurred uploading your file.";  

     }  

};  

oReq.send(oData);  

2、ajax方式(关键是设置:processData 和 contentType )

var formData = new FormData();

var name = $("input").val();

formData.append("file",$("#upload")[0].files[0]);

formData.append("name",name);

$.ajax({

url : Url,

type : 'POST',

data : formData,

// 告诉jQuery不要去处理发送的数据,用于对data参数进行序列化处理 这里必须false

processData : false,

// 告诉jQuery不要去设置Content-Type请求头

contentType : false, //必须

beforeSend:function(){

console.log("正在进行,请稍候");

},

success : function(responseStr) {

if(responseStr.status===0){

console.log("成功"+responseStr);

}else{

console.log("失败");

}

},

error : function(responseStr) {

console.log("error");

}

});


function (iFileID, iUrlInputID) {
    if ($(iFileID).val() == "") {
        $.messager.alert("错误", "请选择要上传的文件!", "error");
        return false;
    }
    var myFormData = new FormData();
    myFormData.append("upfile", $(iFileID).get(0).files[0]);
    $.ajax({
        type: "post",
        url: configInfo.apiRoot + "files", //请求url   
        processData: false,
        contentType: false,
        data: myFormData,
        success: function (data) {
            // 将文件url放到隐藏的输入框里
            $(iUrlInputID).val(data);
            $.messager.alert("信息", "上传文件成功!", "info");
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            // 失败
            $.messager.alert("错误", "上传文件失败!", "error");
        }

    });

}

在 JQuery ajax() 方法中设置contentType = false,不冲突。因为当查看这时的 Request headers,会发现还是有分界符。因为当我们在 form 标签中设置了enctype = “multipart/form-data”,这样请求中的 contentType 就会默认为 multipart/form-data 。而在 ajax 中 contentType 设置为 false 是为了避免 JQuery 对其操作,从而失去分界符,而使服务器不能正常解析文件。



Form表单上传大文件,无法进入后台Action,页面提示404.

web.config中添加如下节点

<system.webServer>

    <security>
      <requestFiltering >
        <requestLimits maxAllowedContentLength="1073741824" ></requestLimits>
      </requestFiltering>

    </security>

</system.webServer>


猜你喜欢

转载自blog.csdn.net/qq_41802303/article/details/80066160