Struts2+json+jQuery上传文件在Firefox和IE下返回结果截然不同
在Struts2中利用json格式返回数据,struts.xml文件配置如下:
<package name="struts2json" extends="json-default"> <!-- jsonfilm --> <action name="jsonFilm" class="film"> <result type="json"> <param name="excludeProperties">.*hibernateLazyInitializer,pageBean,film</param> </result> </action> </package>
而表单利用jquery.form.js插件提供的ajax方式来提交,javascript代码如下:
var options = { url: 'jsonFilm!addFilm.action', dataType: 'json', beforeSubmit: validateAddFilm, success: showResponseAddFilm }; $('#film-form').submit(function() { $(this).ajaxSubmit(options); return false; }); function validateAddFilm(formData, jqForm, options){ //验证代码省略... } function showResponseAddFilm(jsonData, status){ alert(status);//请求结果 }
由于表单中含有文件域file,并且用json格式来返回请求结果,这种情况下虽然文件能正确上传也能正确写入数据库,但是你会发现一个很让人头疼的问题——前台会弹出一个“下载对话框”。
那么我们就改用另一种方式来上传文件和返回数据,这里用到了ajax-file-upload-plugin-0.4.0.jar这个包,这个包是专门为Struts2利用ajax方式上传文件准备的,struts.xml文件配置如下:
<package name="ajaxfileupload" namespace="/" extends="ajaxfileupload-default"> <action name="addFilm" class="film"> <result name="success" type="httpheader"> <param name="status">200</param> </result> </action> </package>
action类中返回return "success";或者return SUCCESS;
这样前台就不会弹出“下载对话框”了。但却发现一个和奇怪的问题,Firefox下能正确执行options中的success回调函数showResponseAddFilm,但IE下却不能。不过后台的文件上传和数据库操作都是成功的,没有问题。
于是我将options中的success换成了complete,因为complete不管结果如何它都会被执行,而success只有成功时才会被执行。结果发现Firefox下返回的status值为success,而IE下返回的status值却总是error。真是搞不懂怎么回事?所以将情况记录下来,希望哪位能指出问题之所在。