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中的作用域scope介绍
Dec 28 Javascript
Node.js开发指南中的简单实例(mysql版)
Sep 17 Javascript
javascript事件函数中获得事件源的两种不错方法
Mar 17 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
JS模拟Dialog弹出浮动框效果代码
Oct 16 Javascript
Ionic如何实现下拉刷新与上拉加载功能
Jun 03 Javascript
JSON对象 详解及实例代码
Oct 18 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
Jun 21 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 Javascript
详解解决小程序中webview页面多层history返回问题
Aug 20 Javascript
es6数组includes()用法实例分析
Apr 18 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
SONY SRF-M100的电路分析
2021/03/02 无线电
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
如何使用php实现评委评分器
2015/07/31 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
基于NodeJS的前后端分离的思考与实践(二)模版探索
2014/09/26 NodeJs
javascript随机显示背景图片的方法
2015/06/18 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
2016/12/27 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
element-ui组件table实现自定义筛选功能的示例代码
2019/03/15 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
Python中datetime模块参考手册
2017/01/13 Python
Django Rest framework权限的详细用法
2019/07/25 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
2020/06/11 Python
CSS+jQuery实现的在线答题功能
2015/04/25 HTML / CSS
HTML5 FileReader对象的具体使用方法
2020/05/22 HTML / CSS
N:Philanthropy官网:美国洛杉矶基础款服装
2020/06/09 全球购物
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
《要下雨了》教学反思
2014/02/17 职场文书
少年闰土教学反思
2014/02/22 职场文书
父亲节寄语大全
2015/02/27 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
详解python字符串驻留技术
2021/05/21 Python
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python