angularjs客戶端實現(xiàn)壓縮圖片文件并上傳實例
主要是利用html5的canvas來進(jìn)行圖片的壓縮,然后轉(zhuǎn)化為dataURL,再有dataURL轉(zhuǎn)化為Blob文件,Blob對象可以直接賦值給Formdata.
app.service('Util', function($q) {
var dataURItoBlob = function(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to a typed array
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], {
type: mimeString
});
};
var resizeFile = function(file) {
var deferred = $q.defer();
var img = document.createElement("img");
try {
var reader = new FileReader();
reader.onload = function(e) {
img.src = e.target.result;
//resize the image using canvas
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var MAX_WIDTH = 800;
var MAX_HEIGHT = 800;
var width = img.width;
var height = 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;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0, width, height);
//change the dataUrl to blob data for uploading to server
var dataURL = canvas.toDataURL('image/jpeg');
var blob = dataURItoBlob(dataURL);
deferred.resolve(blob);
};
reader.readAsDataURL(file);
} catch (e) {
deferred.resolve(e);
}
return deferred.promise;
};
return {
resizeFile: resizeFile
};
});
由于目前angualrjs暫不支持通過multiform data上傳文件,所以利用如下的代碼可以上傳formdata里的文件
app.controller('CompanyCtrl', function($http, Util) {
Util.resizeFile(input.files[0]).then(function(blob_data) {
var fd = new FormData();
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("uploaded error...")
});
}, function(err_reason) {
console.log(err_reason);
});
}
相關(guān)文章
AngularJS學(xué)習(xí)筆記之ng-options指令
ng-options是angular-1.3新出的一個指令,這篇文章就來介紹這個指令的用法.有需要的小伙伴可以參考下。2015-06-06
Angular4學(xué)習(xí)筆記之準(zhǔn)備和環(huán)境搭建項目
這篇文章主要介紹了Angular4學(xué)習(xí)筆記之準(zhǔn)備和環(huán)境搭建項目,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Angularjs自定義指令實現(xiàn)分頁插件(DEMO)
由于最近的一個項目使用的是angularjs1.0的版本,涉及到分頁查詢數(shù)據(jù)的功能,后來自己就用自定義指令實現(xiàn)了該功能,下面小編把實例demo分享到腳本之家平臺,需要的朋友參考下2017-09-09
Angularjs在360兼容模式下取數(shù)據(jù)緩存問題的解決辦法
這篇文章主要為大家詳細(xì)介紹了Angularjs在360兼容模式下取數(shù)據(jù)緩存問題的解決辦法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Angular設(shè)計模式hierarchical?injector實現(xiàn)代碼復(fù)用模塊化
這篇文章主要為大家介紹了Angular設(shè)計模式hierarchical?injector實現(xiàn)代碼復(fù)用模塊化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
angular5 httpclient的示例實戰(zhàn)
本篇文章主要介紹了angular5 httpclient的示例實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
AngularJS動態(tài)綁定ng-options的ng-model實例代碼
本篇文章主要介紹了AngularJS動態(tài)綁定ng-options的ng-model實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

