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 相关文章推荐
8个超棒的学习 jQuery 的网站 推荐收藏
Apr 02 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
Jul 15 Javascript
js实现div闪烁原理及实现代码
Jun 24 Javascript
使用js获取图片原始尺寸
Dec 03 Javascript
javascript的BOM汇总
Jul 16 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
jQuery实现按比例缩放图片的方法
Apr 29 jQuery
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
Dec 13 Javascript
vue中使用GraphQL的实例代码
Nov 04 Javascript
Vue2.0 $set()的正确使用详解
Jul 28 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
header跳转和include包含问题详解
2012/09/08 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
学习php设计模式 php实现备忘录模式(Memento)
2015/12/09 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP获取类私有属性的3种方法
2020/09/10 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
js控制框架刷新
2008/08/01 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
javascript中的new使用
2010/03/20 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
js简单抽奖代码
2015/01/16 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
你真的了解BOM中的history对象吗
2017/02/13 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
python爬取NUS-WIDE数据库图片
2016/10/05 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
Django如何批量创建Model
2020/09/01 Python
用Python实现职工信息管理系统
2020/12/30 Python
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
绿化工程实施方案
2014/03/17 职场文书
团支部推优材料
2014/05/21 职场文书
施工安全汇报材料
2014/08/17 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL