使用uploadify插件做多附件上传的功能,使用谷歌浏览器时一切正常,而用户测试时使用IE或360浏览器时出现一些问题。
一、使用360极速模式下上传附件时报错(Http - error 302)
首先,302错误表示被请求的资源暂时转移(Moved temporatily),然后会给出一个转移后的URL,而浏览器在处理服务器返回的302错误时,原则上会重新建立一个TCP连接,然后再取重定向后的URL的页面;但是如果页面存在于缓存中,则不重新获取。
原因是uploadify发送请求时,360浏览器极速模式下不发送session(网上查询得出),拦截器获取的session一直为null,导致拦截判断当前未登录而没有进行上传操作(用户未登录无法获取当前操作人员);
所以可以在URL中将sessionId传到服务器。
1、jsp中获取sessionId
<!-- 取得sessionId -->
<%
String syscontext = request.getContextPath();
%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path;
String sessionid = session.getId();
%>
2、js代码
jQuery(function() {
getData();//用于加载已上传文件列表的方法,本文中未贴出代码,可忽略
$("#file_upload").uploadify({
height : 20,
swf : contextPath +
'/scripts/uploadify/uploadify.swf',
uploader : '',
width : 100,
auto : false,
multi : true,
'buttonText' : '选择文件',
'multi' : true,
'fileObjName' : 'file',
'onUploadSuccess' : function(file, data, response) {
successFile++;
$('#successFile').html(successFile);
},
'onQueueComplete' : function(queueData) {
reloadGrid();
parent.jQuery('#mydatagrid').datagrid('reload');
}
});
});
var url = contextPath + '/test.do;jsessionid=<%=sessionid%>?method=save';
function saveUpload(){
$('#file_upload').uploadify('settings','uploader',url);
$("#file_upload").uploadify('upload','*');
}
注意:sessionId用”;“分开。
二、使用IE及360报错(Http - error 406)
检查发现IE上传时的请求头中,Accept: text/*
而Chrome的请求头中,Accept: */*
项目中使用springMVC,保存附件的方法中使用了@ResponseBody注解。
第一种方法可以使用返回一个String到页面,第二种方法则不使用@ResponseBody,使用response返回json页面。保存方法接受前台传递的参数,在保存方法中添加下面两行代码。保存方法使用Map< String,String>接收前台传递的参数。
response.setContentType("application/json; charset=UTF-8");
response.getWriter().write(map.String());