angularjs客户端实现压缩图片文件并上传实例
主要是利用html5的canvas来进行图片的压缩,然后转化为dataURL,再有dataURL转化为Blob文件,Blob对象可以直接赋值给Formdata.
app.service('Util',function($q){
vardataURItoBlob=function(dataURI){
//convertbase64/URLEncodeddatacomponenttorawbinarydataheldinastring
varbyteString;
if(dataURI.split(',')[0].indexOf('base64')>=0)
byteString=atob(dataURI.split(',')[1]);
else
byteString=unescape(dataURI.split(',')[1]);
//separateoutthemimecomponent
varmimeString=dataURI.split(',')[0].split(':')[1].split(';')[0];
//writethebytesofthestringtoatypedarray
varia=newUint8Array(byteString.length);
for(vari=0;i<byteString.length;i++){
ia[i]=byteString.charCodeAt(i);
}
returnnewBlob([ia],{
type:mimeString
});
};
varresizeFile=function(file){
vardeferred=$q.defer();
varimg=document.createElement("img");
try{
varreader=newFileReader();
reader.onload=function(e){
img.src=e.target.result;
//resizetheimageusingcanvas
varcanvas=document.createElement("canvas");
varctx=canvas.getContext("2d");
ctx.drawImage(img,0,0);
varMAX_WIDTH=800;
varMAX_HEIGHT=800;
varwidth=img.width;
varheight=img.height;
if(width>height){
if(width>MAX_WIDTH){
height*=MAX_WIDTH/width;
width=MAX_WIDTH;
}
}else{
if(height>MAX_HEIGHT){
width*=MAX_HEIGHT/height;
height=MAX_HEIGHT;
}
}
canvas.width=width;
canvas.height=height;
varctx=canvas.getContext("2d");
ctx.drawImage(img,0,0,width,height);
//changethedataUrltoblobdataforuploadingtoserver
vardataURL=canvas.toDataURL('image/jpeg');
varblob=dataURItoBlob(dataURL);
deferred.resolve(blob);
};
reader.readAsDataURL(file);
}catch(e){
deferred.resolve(e);
}
returndeferred.promise;
};
return{
resizeFile:resizeFile
};
});
由于目前angualrjs暂不支持通过multiformdata上传文件,所以利用如下的代码可以上传formdata里的文件
app.controller('CompanyCtrl',function($http,Util){
Util.resizeFile(input.files[0]).then(function(blob_data){
varfd=newFormData();
fd.append("imageFile",blob_data);
$http.post('http://your.domain.com/upload',fd,{
headers:{'Content-Type':undefined},
transformRequest:angular.identity
})
.success(function(data){
$scope.model.company_pict=data[0];
})
.error(function(){
console.log("uploadederror...")
});
},function(err_reason){
console.log(err_reason);
});
}