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车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
js实现html table 行,列锁定的简单实例
Oct 13 Javascript
详解jQuery中基本的动画方法
Dec 14 Javascript
jQuery实现键盘回车搜索功能
Jul 25 jQuery
基于jQuery的表单填充实例
Aug 22 jQuery
详解Vue快速零配置的打包工具——parcel
Jan 16 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
详解vue移动端项目代码拆分记录
Mar 15 Javascript
vue2实现provide inject传递响应式
May 21 Vue.js
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无限级栏目分类读取的实现代码
2014/02/19 PHP
PHP多文件上传类实例
2015/03/07 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
许愿墙中用到的函数
2006/10/07 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
javascript版2048小游戏
2015/03/18 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
2017/01/18 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
vue组件通信传值操作示例
2019/01/08 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
2019/12/06 Javascript
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python实现保证只能运行一个脚本实例
2015/06/24 Python
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
学习十八大演讲稿
2014/09/15 职场文书
2015年幼儿园学前班工作总结
2015/05/18 职场文书
神秘岛读书笔记
2015/07/01 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android