文件上传的两种情况及mock时对应处理办法

来源:互联网 发布:天刀太白捏脸数据 编辑:程序博客网 时间:2024/06/05 17:45

文章为转载过来的,还没时间研究,先记录一下:


1,给文件一个独立的url,要求文件上传至该地址 


这种情况下,需要一个上传组件,比如异步上传组件,ajaxfileupload.js 



2,没有给文件一个独立的url,而是跟其他字段一起上传 

解决方案一:直接是一个form表单 
Html代码  收藏代码
  1. <iframe id="upload_target" name="upload_target" src="" style="width:0;height:0;border:0px solid #fff;"></iframe>  
  2.   
  3. <form name="excelupload" id="excelupload" action="/xx/createExcelXX.action" method="POST" enctype="multipart/form-data" target="upload_target">  
  4.   
  5.     <input name="XXName" type="text"  />  
  6.   
  7.     <input type="file" name="file" id="file" size="45" />  
  8.   
  9. </form>  

(1)由于form会跳转页面,设置其target跳转到iframe,这样就不会发生页面跳转了。 
(2)如果提交按钮不在form里,可以使用$("#formId").submit();方法 


如果是mock阶段,如何测试? 

直接报错: 
"NetworkError: 404 Not Found - http://localhost/xx/createExcelXX.action" 

原因:mockjax只支持ajax请求,不支持form表单,所以失败。 
详见地址:https://github.com/appendto/jquery-mockjax 

解决办法:暂无解 


解决方案二:生成临时form模拟Ajax请求 

动态生成form。 

加上附加字段 

如果是mock阶段,如何测试? 
可以测试,因为此时已经是ajax请求。 

使用例子:完整版详见附件 
Js代码  收藏代码
  1. //初始化文件上传组件  
  2. initUploader:function(){  
  3.     var _this = this;  
  4.   
  5.     var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;  
  6.     var splitPath = function(filename) {  
  7.         return splitPathRe.exec(filename).slice(1);  
  8.     };  
  9.   
  10.     //Excel上传控件  
  11.     this.batch_uploader = new Uploader({  
  12.         trigger: '#file',  
  13.         name: 'file',  
  14.         action: CREATE_EXCELFEED_URL,  
  15.         accept: 'application/vnd.ms-excel',  
  16.         data: {},  
  17.         dataType:'json',  
  18.         multiple: false  
  19.     }).change(function(files) {  
  20.         for (var i = 0; i < files.length; i++) {  
  21.             var fileType = splitPath(files[i].name)[3];  
  22.             if (fileType !== ".xls") {  
  23.                 alert("文件格式错误, 请上传.xls格式文件!");  
  24.             } else {  
  25.                 $('.batch-upload-filename').html(files[i].name);  
  26.             }  
  27.         }  
  28.     }).success(function(response) {  
  29.         console.log(response);  
  30.         /* 
  31.         var res; 
  32.         if(/msie/.test(navigator.userAgent.toLowerCase())) { 
  33.             res = $.parseJSON($(response).text()); 
  34.         } else { 
  35.             res = $.parseJSON(response); 
  36.         } 
  37.         if (res.status == '1') { 
  38.             alert("文件上传成功!"); 
  39.         } else { 
  40.             _this.fail(res); 
  41.         }*/  
  42.         _this.$el.find('.batch-upload-filename').html(' 未选择文件');  
  43.     }).error(function(file) {  
  44.         console.log(file);  
  45.     });  
  46. },  
  47. //销毁上传组件  
  48. destoryUploader:function(){  
  49.     this.batch_uploader = null;  
  50.     $("form.earth-upload").remove();  
  51. },  
  52.   
  53.   
  54.   
  55. //创建  
  56. create:function(){  
  57.     var _this = this;  
  58.   
  59.     //校验未通过  
  60.     if(!this.validate()){  
  61.         return false;  
  62.     }  
  63.     var params = this.collectSubmitParams();  
  64.   
  65.     var feedType = this.model.get("feedType");  
  66.     if(feedType === "xml"){//自动上传  
  67.           
  68.     }else if(feedType === "excel"){//手动上传  
  69.         //console.log(this.$el.find("#excelupload")[0].action);  
  70.         //this.$el.find("#excelupload")[0].action = CREATE_EXCELFEED_URL;  
  71.         //console.log(this.$el.find("#excelupload")[0].action);  
  72.         //this.$el.find("#excelupload").submit();  
  73.   
  74.   
  75.   
  76.         if(this.batch_uploader._uploaders[0]._files) {  
  77.             $(".errormsg").hide();  
  78.             console.log(this.batch_uploader._uploaders[0].form);  
  79.             this.batch_uploader._uploaders[0].form.append(_this.createInputs(params));  
  80.             this.batch_uploader.submit();  
  81.         } else {  
  82.             $(".errormsg").html("请先选择要上传的文件,再提交!").show();  
  83.             return false;  
  84.         }  
  85.     }  
  86.     return false;  
  87. },  
  88.   
  89.   
  90. //上传控件的patch  
  91. createInputs: function (data) {  
  92.     if (!data) return [];  
  93.     var inputs = [], i;  
  94.     for (var name in data) {  
  95.         i = document.createElement('input');  
  96.         i.type = 'hidden';  
  97.         i.name = name;  
  98.         i.value = data[name];  
  99.         inputs.push(i);  
  100.     }  
  101.     return inputs;  
  102. }  
0 0
原创粉丝点击