一个不错的解决方式就是将base64编码的图片数据转换为blob(与file相似)并添加到form中提交。下面是代码:
/** * @param base64codes * 图片的base64编码 */ function sumitimagefile(base64codes){ var form=document.forms[0]; var formdata = new formdata(form); //这里连带form里的其他参数也一起提交了,如果不需要提交其他参数可以直接formdata无参数的构造函数 //convertbase64urltoblob函数是将base64编码转换为blob formdata.append("imagename",convertbase64urltoblob(base64codes)); //append函数的第一个参数是后台获取数据的参数名,和html标签的input的name属性功能相同 //ajax 提交form $.ajax({ url : form.action, type : "post", data : formdata, datatype:"text", processdata : false, // 告诉jquery不要去处理发送的数据 contenttype : false, // 告诉jquery不要去设置content-type请求头 success:function(data){ window.location.href="${ctx}"+data; }, xhr:function(){ //在jquery函数中直接使用ajax的xmlhttprequest对象 var xhr = new xmlhttprequest(); xhr.upload.addeventlistener("progress", function(evt){ if (evt.lengthcomputable) { var percentcomplete = math.round(evt.loaded * 100 / evt.total); console.log("正在提交."+percentcomplete.tostring() + '%'); //在控制台打印上传进度 } }, false); return xhr; } }); } /** * 将以base64的图片url数据转换为blob * @param urldata * 用url方式表示的base64图片数据 */ function convertbase64urltoblob(urldata){ var bytes=window.atob(urldata.split(',')[1]); //去掉url的头,并转换为byte //处理异常,将ascii码小于0的转换为大于0 var ab = new arraybuffer(bytes.length); var ia = new uint8array(ab); for (var i = 0; i < bytes.length; i++) { ia[i] = bytes.charcodeat(i); } return new blob( [ab] , {type : 'image/png'}); }
