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系列(49):Function模式(上篇)
Mar 04 Javascript
JavaScript将数字转换成大写中文的方法
Mar 23 Javascript
jQuery插件制作之全局函数用法实例
Jun 01 Javascript
使用JQuery 加载页面时调用JS的实现方法
May 30 Javascript
利用Angular.js限制textarea输入的字数
Oct 20 Javascript
如何使用vuejs实现更好的Form validation?
Apr 07 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
关于vue面试题汇总
Mar 20 Javascript
JS实现自定义弹窗功能
Aug 08 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
基于JS开发微信网页录音功能的实例代码
Apr 30 Javascript
了解javascript中let和var及const关键字的区别
May 24 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二维数组排序方法(array_multisort usort)
2013/12/25 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
json跟xml的对比分析
2008/06/10 Javascript
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
JQuery中clone方法复制节点
2015/05/18 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
利用JS轻松实现获取表单数据
2016/12/06 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
2016/12/06 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
JS数组进阶示例【数组的几种函数用法】
2020/01/16 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
python书籍信息爬虫实例
2018/03/19 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
英国Office鞋店德国网站:在线购买鞋子、靴子和运动鞋
2018/12/19 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
文明村创建实施方案
2014/03/27 职场文书
工地质量标语
2014/06/12 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书