Ajax文件上传插件很多,但兼容性各不一样,许多是对ie不兼容的,另外项目中是要求将网页内容嵌入到桌面端应用的,这样就不允许带flash的上传插件了,如:jquery uploadify。。。悲剧
对于Ajax文件上传,大体是有:
1、创建一个input type="file" 的文件上传按钮,根据其id监听绑定其change事件,在事件中用jquery创建一个iframe,嵌入添加隐藏form,同时创建input type="file",id相同的文件上传按钮,并传入其他需要提交的数据,然后提交,提交完成后移除一个input type="file",这样用bind或on的绑定就对新的input 框失效,需要重新再绑定一次change事件,以前的jquery是可以使用live函数代替的,现在只能在文件上传成功后再绑定一次change事件。
1 $(function() { 2 uploadFile("fileData",'cn.ftiao.cm.model.LiveCourse','',"CI"); 3 }); 4 5 function uploadFile(id,classFullName,jsonStrValue,preFileName){ 6 $("#"+id).on("change", function(){ 7 // 上传方法 8 $.ajaxFileUpload({ 9 url:$("#"+id).attr("data-url-upload"), //需要链接到服务器地址10 secureuri:false,11 type:"post",12 fileElementId:id, //文件选择框的id属性13 dataType: 'json', 14 data:{15 "classFullName":classFullName,16 "jsonStrValue":"",17 "preFileName":preFileName18 },19 //服务器返回的格式,可以是json20 success: function (data, status){ //相当于java中try语句块的用法21 $("#courseIconImg").attr("src",$(".ctx").val()+"/images/img-class.png");22 alert("hello");23 //先将原有的上传展示清除24 $("#" + id).nextAll("span").remove();25 $("#courseIcon").val(data.outputFileName);26 // $("#coursewareFile").val(data.outputFileName);27 var uploadHtml = "";28 uploadHtml += data.fileUploadName ;29 uploadHtml += " 预览 删除 ";30 uploadHtml += "";31 // $("#"+id).parents("li").append(uploadHtml);32 uploadFile("fileData",'cn.ftiao.cm.model.LiveCourse','',"CI");33 },34 error: function (data, status, e) //相当于java中catch语句块的用法35 {36 alert(e);37 }38 });39 });40 return false;41 }
2、创建一个 input type="file"的按钮,监听其click事件,然后创建iframe,隐藏form,隐藏form里有个 input type="file"的文件上传框,模拟点击click,弹出文件选择框,选择完文件后上传。此方法在ie下会报 “权限不足” 问题。
下面是ajaxFileUpload 插件
1 jQuery.extend({ 2 3 handleError: function(s, xhr, status, e) { 4 // If a local callback was specified, fire it 5 if (s.error) { 6 s.error.call(s.context || window, xhr, status, e); 7 } 8 9 // Fire the global callback 10 if (s.global) { 11 (s.context ? jQuery(s.context) : jQuery.event).trigger("ajaxError", [xhr, s, e]); 12 } 13 }, 14 createUploadIframe: function(id, uri) 15 { 16 //create frame 17 var frameId = 'jUploadFrame' + id; 18 var iframeHtml = '