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实现一些常用软件的下载导航
Aug 03 Javascript
JavaScript CSS修改学习第三章 修改样式表
Feb 19 Javascript
jQuery获取地址栏参数插件(模仿C#)
Oct 26 Javascript
通过Javascript创建一个选择文件的对话框代码
Jun 16 Javascript
javascript二维数组转置实例
Jan 22 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
纯JavaScript代码实现移动设备绘图解锁
Oct 16 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
Mar 25 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
利用Vue.js实现求职在线之职位查询功能
Jul 03 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 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批量检测并去除文件BOM头代码实例
2014/05/08 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
JavaScript的设计模式经典之建造者模式
2016/02/24 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
js判断传入时间和当前时间大小实例(超简单)
2018/01/11 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
2018/11/08 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
python下载文件记录黑名单的实现代码
2017/10/24 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
使用PYTHON解析Wireshark的PCAP文件方法
2019/07/23 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
Python: glob匹配文件的操作
2020/12/11 Python
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
个人反四风对照检查材料思想汇报
2014/09/23 职场文书
少年犯观后感
2015/06/11 职场文书
妇联2016年六一国际儿童节活动总结
2016/04/06 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
创业计划书之书店
2019/09/10 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js