首先, 在 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>

通过$.Ajax()方式上传文件,使用FormData进行Ajax请求,应注意相关推荐

  1. koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求

    koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找. 参考了这个用base64上传图片的例子.https://github.com/Yuki-Mi ...

  2. jquery ajax java上传文件_jQuery Ajax方式上传文件的方法

    jQuery Ajax方式上传文件用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这 ...

  3. ashx获取input file 文件_通过Ajax方式上传文件(input file),使用FormData进行Ajax请求...

    一直以来上传文件都使用的是别人的组件,今天看下无刷新上传内部具体的做法.上传文件可以使用form的形式来上传,也可以通过构造formData使用ajax来上传文件: 上传图片 $(function ( ...

  4. php ajax xmlhttpreq 上传文件 get,使用jQuery Ajax异步上传文件方法总结

    一 使用FormData对象上传文件 FormData对象,是可以使用一系列的键值对来模拟一个完整的表单,然后使用XMLHttpRequest发送这个"表单".但上传文件部分只有底 ...

  5. 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求

    <script type="text/jscript">$(function () {$("#btn_uploadimg").click(funct ...

  6. Ajax方式上传文件报错Uncaught TypeError: Illegal invocation

    今天使用ajax上传文件时,出现了错误.数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求.F12看到后台报了个错误:Uncaught TypeEr ...

  7. ajax实现上传文件的进度,基于Ajax技术实现文件上传带进度条

    1.概述 在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能.在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条.运 ...

  8. 使用插件ajaxfileupload通过ajax方式上传文件,在火狐下出错

    ====================================================== 注:本文源代码点此下载 ================================= ...

  9. ajax异步上传什么意思,使用 jQuery 的 AJAX 异步上传文件

    现在基本上很多网页里面都在使用 jQuery,要实现文件的异步上传,大多数的解决方法都是使用 jQuery 插件,如果你只是上传一张图片,使用插件反而觉得多余了,其实 jQuery 的 ajax() ...

最新文章

  1. Atlas机器人再秀逆天操作!波士顿动力科研or商业化,将何去何从?
  2. java并发编程之4——Java锁分解锁分段技术
  3. ubuntu server 9.04下配置ftp服务和可读写samba服务
  4. jenkins修改pom文件_DevOps实践:Jenkins与Nexus制品库集成
  5. 观点:比特币新一轮突破“即将到来”
  6. Base64 的 JavaScript 实现 js-base64
  7. 【Java】java插件化开发
  8. 【雨滴风格 时间倒计时置顶显示小工具】
  9. 谷歌浏览器如何给长网页截图?
  10. HTML5基础之代码入门
  11. 【UI界面设计】PS基础学习笔记
  12. mysql数据库事务的实现原理
  13. 找工作,要做就做最好的自己,大平台去闯闯,一定不要让未来后悔!~附简历...
  14. pythongui日历控件_“五一”快到了,用Python中PyQt5做一个日历,QCalendar控件详解...
  15. java上机实验作业 编写汽车类car_请问如何用Java编写一个汽车类Car
  16. 自己的坟被人挖了怎么办,今天是一个时间限制
  17. 判断奇偶(c++基础)
  18. 一键安装LAMP脚本
  19. Nuxt 整合 element-tiptap 编辑器 上传图片到阿里云OSS关键方法
  20. 九、Linux之dup和dup2函数

热门文章

  1. 【时序】时间序列预测真的需要深度学习吗?
  2. R语言实现数据抽样创建训练集和测试集
  3. VS CODE 安装vetur后不生效问题解决
  4. 首选项配置+Eslint+prettier+Vetur
  5. windows SDK学习资料推荐
  6. vue2项目之明日科技51购物商店官网-本地项目版本
  7. 力扣算法刷题Day30|回溯:重新安排行程 N皇后 解数独
  8. Instagram大爆炸:坚守专注简洁的乔布斯法则
  9. 西游记中奎木狼出现的四次
  10. Linux忘记root密码及设置root密码的图文操作方法