模拟AJAX无刷新的文件上传功能
展开/收缩传统的文件上传功能一般是用form包一个input:file直接提交到后端进行处理,form须指定enctype=”multipart/form-data”,代码如下:
<form action="test.php" target="" method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file" />
<input type="submit" id="J_submit" value="submit" />
</form>
在ajax盛行的现时,提交form再刷新整个页面,显得用户体验不佳,然而ajax与后端通信 只能传送字符串,是无法传递实体文件的,所以用ajax是无法实现直接文件上传的,这里提供一个解决方案就是用一个实时创建的隐藏iframe来完成上传功能, 具体的原理是,在点击提交按钮时,动态的生成一个隐藏iframe加入到页面上,并且 将form 的 target指向该隐藏iframe,服务端就接收到上传的file文件,并进行相应的操作,然后将返回结果返回到隐藏的iframe里面,这时我们可以与后端开发约定返回结果的格式,可以是json格式,便于我们前端操作,然后前端部分就可以用iframe.contentWindow.document.body.innerHTML来获取后端返回的结果,进行相应的parseJSON处理,即可像处理ajax返回的json一样,处理数据。。。直接贴源代码了(ps:代码是基于jQuery库的):
/**
* 模拟ajax无刷新文件上传
*/
var fileUpLoad = function(config) {
var ifr = null,
fm = null,
defConfig = {
submitBtn: $('#J_submit'), //提交按钮
complete: function(response) {}, //上传成功后回调
beforeUpLoad: function() {}, //点击提交未上传时回调
afterUpLoad: function() {} //点击提交上传后回调
};
//静态变量
var IFRAME_NAME = 'fileUpLoadIframe';
//配置
config = $.extend(defConfig, config);
//绑定submit事件
config.submitBtn.bind('click', function(e){
e.preventDefault();
//点击提交前触发事件, 函数返回false可阻止提交表单,用于file为空判断
if (config.beforeUpLoad.call(this) === false) {
return;
}
//生成一个隐藏iframe,并设置form的target为该iframe,模拟ajax效果
ifr = $('<iframe name="'+ IFRAME_NAME +'" id="'+ IFRAME_NAME +'" style="display:none;"></iframe>');
fm = this.form;
ifr.appendTo($('body'));
fm.target = IFRAME_NAME; //target目标设为ifr
//上传完毕iframe onload事件
ifr.load(function(){
var response = this.contentWindow.document.body.innerHTML;
config.complete.call(this, response);
ifr.remove();
ifr = null; //清除引用
});
fm.submit(); //提交表单
//点击提交后触发事件
config.afterUpLoad.call(this);
});
};
页面调用是:
fileUpLoad({
submitBtn: $('#J_submit'),
complete: function(response){ //上传成功后处理回调
var d = $.parseJSON(response);
alert('返回成功')
console.log(d);
},
beforeUpLoad: function() {
alert('上传前');
},
afterUpLoad: function() {
alert('上传后');
}
});
而对于需要实时显示上传进度条的应用,则可以考虑form提交后用ajax实时轮询的方式向后端取文件上传的进度,来进行前端页面进度渲染,另一种方式则是基于flash上传,这里就不详细展开了。。
Der's Blog