存档

文章标签 ‘Firefox’

Struts2+json+jQuery上传文件在Firefox和IE下返回结果截然不同

2009年10月23日 IT北瓜 4 条评论

      在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。真是搞不懂怎么回事?所以将情况记录下来,希望哪位能指出问题之所在。