前言
我们都知道js上传附件两种方式 ,一种是FormData对象提交,一种是流,但是用的最多的还是formdata,直接以文件形式上传,这种方式相对简单易理解,下面介绍一下我在使用formdata时遇到的一个较奇葩的问题。
1、准备文件标签
2、js获取文件对象和其他参数对象
3、创建FormData对象存储文件和其他参数信息。
4、通过Ajax发送请求,传递参数。
5、服务端我用的是webapi,其他基于http的web方式 都支持,利用HttpFileCollection filelist = HttpContext.Current.Request.Files/param进行获取文件或者属性信息。
以上就是通过js上传附件的流程,看似简单,不注意还是有坑的,
例如;
var formData = new FormData();
formData.append("file",$("#cztp").textbox('getValue'));
formData.append("TaskNumber",id);
formData.append("EventStateCode","BFC4904F-3165-4AA8-B693-35AB8BAE291F");
formData.append("EventStateName","待核查");
formData.append("ForDepartmentCode",users.UserDepartmentCode);
创建好了FormData以后,按照以往的方式采用ajax的post 方式
jQuery.post(url,data,success(data, textStatus, jqXHR),dataType)
等价于
$.ajax({
type: 'POST',
url: url,
data: data,
success: success,
dataType: dataType
});
结果后台请求不到,也不报错,此时你去console(formdata)也是空的,可能formdata对象不是这样查看,具体可以百度一下。但是换成标准的ajax请求以后就可以了,即$.ajax({
type: 'POST',
url: url,
data: data,
success: success,
dataType: dataType
});。
我这边用到的代码如下
$.ajax({ // $.post,告辞
type: 'post',
contentType: false, // 关关关!必须得 false
// 这个不关会扔一个默认值 application/x-www-form-urlencoded 过去,后端拿不到数据的!
// 而且你甚至不能传个字符串 'multipart/form-data',后端一样拿不到数据!
processData: false, // 关关关!重点
url: url,
data: formData,
success: function (data) {
if (data == "success")
$.messager.alert('温馨提示', '提交成功', 'info');
else
$.messager.alert('温馨提示', '提交失败:', 'error');
}
});
最后分析原因,应该是 . p o s t ( ) 方 式 省 略 了 部 分 a j a x 的 相 关 属 性 配 置 , 导 致 f o r m d a t a 不 支 持 传 递 。 例 如 c o n t e n t T y p e , .post()方式省略了部分ajax的相关属性配置,导致formdata不支持传递。 例如 contentType, .post()方式省略了部分ajax的相关属性配置,导致formdata不支持传递。例如contentType,.post(),没有做设置直接使用application/x-www-form-urlencoded头提交,肯定解析不了,所以。。。
processData:在使用jQuery的$.ajax()方法的时候参数processData默认为true(该方法为jQuery独有的)
默认情况下会将发送的数据序列化以适应默认的内容类型application/x-www-form-urlencoded
如果想发送不想转换的的信息的时候需要手动将其设置为false。
因此,在上传附件时需注意ajax的form提交方式。