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 相关文章推荐
ExtJS 2.0 GridPanel基本表格简明教程
May 25 Javascript
JavaScript 变量作用域分析
Jul 04 Javascript
jQuery ajax dataType值为text json探索分享
Sep 23 Javascript
用jquery等比例控制图片宽高的具体实现
Jan 28 Javascript
JS实现可调整倒计时间代码分享
Aug 18 Javascript
全面解析Bootstrap表单使用方法(表单控件状态)
Nov 24 Javascript
轻松学习Javascript闭包函数
Dec 15 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
Jul 18 Javascript
基于jQuery实现照片墙自动播放特效
Jan 12 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
Feb 10 Javascript
详解微信小程序图片地扯转base64解决方案
Aug 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
十天学会php之第九天
2006/10/09 PHP
PHP乱码问题,UTF-8乱码常见问题小结
2012/04/09 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
js模拟弹出效果代码修正版
2008/08/07 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
Nodejs+express+html5 实现拖拽上传
2014/08/08 NodeJs
jQuery对val和atrr(&quot;value&quot;)赋值的区别介绍
2014/09/26 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
详解jQuery中的empty、remove和detach
2016/04/11 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
2017/05/13 jQuery
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python3使用matplotlib绘制条形图
2020/03/25 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
django列表筛选功能的实现代码
2020/03/27 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
护理中职生求职信范文
2014/02/24 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
新文化运动的基本口号
2014/06/21 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2015高考寄语集锦
2015/02/27 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
python实现简易自习室座位预约系统
2021/06/30 Python
nginx搭建NFS网络文件系统
2022/04/14 Servers