我用的是springboot项目,现在需要做一个文件上传功能,选用ajaxfileupload异步提交,开始是将自定义参数拼接到url后面,用 url:“url?data=”+data 的方式传入后台,但是后来因为参数过长,会导致GET请求方式无法达到后台,所以就想换成POST提交,但是遇到了种种困难,下面来详细说一下:
先说一下ajaxfileupload的相关参数:
1、url 上传处理程序地址。
2,fileElementId 需要上传的文件域的ID,即的ID。
3,secureuri 是否启用安全提交,默认为false。
4,dataType 服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
5,success 提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
6,error 提交失败自动执行的处理函数。
7,data 自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
8, type 当要提交自定义参数时,这个参数要设置成pos
这样可以看到ajaxfileupload是可以支持POST提交,并且除了上传文件外还能将自定义参数带过去的。
于是这样就可以改为上面post的提交方式了,自定义参数值给data属性,type值为post
这样就改为了post提交,注意后台接收的时候如果参数写在方法形参处,这时候会报错无法处理post请求,因为现在data传的值为null,形参没有dataJson的值,会找不到方法的。
至于为什么命名传了data但是后台却没收到值呢,这是因为我们虽然自定义写了参数,但是ajaxfileupload默认是没有将参数拼接传入后台的,ajaxfileupload的具体实现方式请另行百度,大致原理就是他自己封装了一个form表单提交,所以现在我们需要在他源码ajaxfileupload.js里面加三个东西(加粗斜体字体为新加的)。
1、var form = jQuery.createUploadForm(id, s.fileElementId,s.data);
2、createUploadForm: function(id, fileElementId,data)
3、
jQuery(oldElement).appendTo(form);
if (data) {
for (var i in data) {
// $(’’).appendTo(form);
$("").appendTo(form);
}
}
//set attributes
jQuery(form).css(‘position’, ‘absolute’);
这样就能成功将data传入后台了。