js上传附件遇到的坑

前言
我们都知道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()ajaxformdatacontentType.post(),没有做设置直接使用application/x-www-form-urlencoded头提交,肯定解析不了,所以。。。
processData:在使用jQuery的$.ajax()方法的时候参数processData默认为true(该方法为jQuery独有的)
默认情况下会将发送的数据序列化以适应默认的内容类型application/x-www-form-urlencoded
如果想发送不想转换的的信息的时候需要手动将其设置为false。

因此,在上传附件时需注意ajax的form提交方式。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值