首页 > 语言 > JavaScript > 正文

angularjs客户端实现压缩图片文件并上传实例

2024-05-06 16:22:44
字体:
来源:转载
供稿:网友

这篇文章主要介绍了angularjs客户端实现压缩图片文件并上传实例,本文直接给出代码实例,需要的朋友可以参考下

主要是利用html5的canvas来进行图片的压缩,然后转化为dataURL,再有dataURL转化为Blob文件,Blob对象可以直接赋值给Formdata.

 

 
  1. app.service('Util'function($q) { 
  2. var dataURItoBlob = function(dataURI) { 
  3. // convert base64/URLEncoded data component to raw binary data held in a string 
  4. var byteString; 
  5. if (dataURI.split(',')[0].indexOf('base64') >= 0) 
  6. byteString = atob(dataURI.split(',')[1]); 
  7. else 
  8. byteString = unescape(dataURI.split(',')[1]); 
  9.  
  10. // separate out the mime component 
  11. var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; 
  12.  
  13. // write the bytes of the string to a typed array 
  14. var ia = new Uint8Array(byteString.length); 
  15. for (var i = 0; i < byteString.length; i++) { 
  16. ia[i] = byteString.charCodeAt(i); 
  17.  
  18. return new Blob([ia], { 
  19. type: mimeString 
  20. }); 
  21. }; 
  22.  
  23. var resizeFile = function(file) { 
  24. var deferred = $q.defer(); 
  25. var img = document.createElement("img"); 
  26. try { 
  27. var reader = new FileReader(); 
  28. reader.onload = function(e) { 
  29. img.src = e.target.result; 
  30.  
  31. //resize the image using canvas 
  32. var canvas = document.createElement("canvas"); 
  33. var ctx = canvas.getContext("2d"); 
  34. ctx.drawImage(img, 0, 0); 
  35. var MAX_WIDTH = 800; 
  36. var MAX_HEIGHT = 800; 
  37. var width = img.width; 
  38. var height = img.height; 
  39. if (width > height) { 
  40. if (width > MAX_WIDTH) { 
  41. height *= MAX_WIDTH / width; 
  42. width = MAX_WIDTH; 
  43. else { 
  44. if (height > MAX_HEIGHT) { 
  45. width *= MAX_HEIGHT / height; 
  46. height = MAX_HEIGHT; 
  47. canvas.width = width; 
  48. canvas.height = height; 
  49. var ctx = canvas.getContext("2d"); 
  50. ctx.drawImage(img, 0, 0, width, height); 
  51.  
  52. //change the dataUrl to blob data for uploading to server 
  53. var dataURL = canvas.toDataURL('image/jpeg'); 
  54. var blob = dataURItoBlob(dataURL); 
  55.  
  56. deferred.resolve(blob); 
  57. }; 
  58. reader.readAsDataURL(file); 
  59. catch (e) { 
  60. deferred.resolve(e); 
  61. return deferred.promise; 
  62.  
  63. }; 
  64. return { 
  65. resizeFile: resizeFile 
  66. }; 
  67.  
  68. }); 

由于目前angualrjs暂不支持通过multiform data上传文件,所以利用如下的代码可以上传formdata里的文件

 

 
  1. app.controller('CompanyCtrl'function($http, Util) { 
  2.  
  3. Util.resizeFile(input.files[0]).then(function(blob_data) { 
  4. var fd = new FormData(); 
  5. fd.append("imageFile", blob_data); 
  6. $http.post('http://your.domain.com/upload', fd, { 
  7. headers: {'Content-Type': undefined }, 
  8. transformRequest: angular.identity 
  9. }) 
  10. .success(function(data) { 
  11. $scope.model.company_pict = data[0]; 
  12. }) 
  13. .error(function() { 
  14. console.log("uploaded error..."
  15. }); 
  16. }, function(err_reason) { 
  17. console.log(err_reason); 
  18. }); 
  19.  
  20.  

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选