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


Posted in Javascript onJuly 06, 2015

主要是利用html5的canvas来进行图片的压缩,然后转化为dataURL,再有dataURL转化为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);
    });


}

Javascript 相关文章推荐
javascript编程起步(第七课)
Feb 27 Javascript
一个符号插入器 中用到的js代码
Sep 04 Javascript
JavaScript避免内存泄露及内存管理技巧
Sep 05 Javascript
js省市联动效果完整实例代码
Dec 09 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
JavaScript字符串常用的方法
Mar 10 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
Sep 14 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
微信小程序实战之自定义toast(6)
Apr 18 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
浅谈ES6新增的数组方法和对象
Aug 08 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
Oct 19 Javascript
jQuery 遍历函数详解
Jul 05 #Javascript
php结合imgareaselect实现图片裁剪
Jul 05 #Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
Jul 05 #Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 #Javascript
IE浏览器下PNG相关功能
Jul 05 #Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
Jul 05 #Javascript
javascript实现控制的多级下拉菜单
Jul 05 #Javascript
You might like
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
PHP 强制下载文件代码
2010/10/24 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php广告加载类用法实例
2014/09/23 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
PHP strcmp()和strcasecmp()的区别实例
2016/11/05 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
JavaScript中用getDate()方法返回指定日期的教程
2015/06/09 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
js css自定义分页效果
2017/02/24 Javascript
原生js二级联动效果
2017/06/20 Javascript
详解在 Angular 项目中添加 clean-blog 模板
2017/07/04 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
在IIS服务器上以CGI方式运行Python脚本的教程
2015/04/25 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python元组常见操作示例
2019/02/19 Python
利用pandas合并多个excel的方法示例
2019/10/10 Python
Python @property及getter setter原理详解
2020/03/31 Python
印尼购物网站:iLOTTE
2019/10/16 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
大一军训感言
2014/01/09 职场文书
小学生暑假家长评语
2014/04/17 职场文书
学风建设演讲稿
2014/09/12 职场文书
校园广播稿100字
2014/10/06 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
2015年度对口支援工作总结
2015/07/22 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
又涨知识了,自律到底多重要?
2019/06/27 职场文书
使用Apache Camel表达REST服务的方法
2022/06/10 Servers