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 相关文章推荐
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
鼠标拖拽移动子窗体的JS实现
Feb 25 Javascript
js闭包的用途详解
Nov 09 Javascript
JavaScript对象数组的排序处理方法
Oct 21 Javascript
Bootstrap每天必学之轮播(Carousel)插件
Apr 25 Javascript
JavaScript实现广告弹窗效果
Aug 09 Javascript
详解JavaScript模块化开发
Dec 04 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
Dec 16 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
Sep 19 Javascript
基于vue展开收起动画的示例代码
Jul 05 Javascript
判断文字超过2行添加展开按钮,未超过则不显示,溢出部分显示省略号
Apr 28 Javascript
浅析 Vue 3.0 的组装式 API(一)
Aug 31 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
再说下636单管机
2021/03/02 无线电
php的ZipArchive类用法实例
2014/10/20 PHP
通过php修改xml文档内容的方法
2015/01/23 PHP
php比较相似字符串的方法
2015/06/05 PHP
PDO::query讲解
2019/01/29 PHP
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
JS实现图片放大镜效果的方法
2015/02/27 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
python常规方法实现数组的全排列
2015/03/17 Python
Python实现从URL地址提取文件名的方法
2015/05/15 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
PyQt5实现画布小程序
2020/05/30 Python
Python3获取cookie常用三种方案
2020/10/05 Python
python 实现性别识别
2020/11/21 Python
美国职棒大联盟官方网上商店:MLBShop.com
2017/11/12 全球购物
西班牙宠物用品和食品网上商店:Tiendanimal
2019/06/06 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
会计系中文个人求职信
2013/12/24 职场文书
优秀教师主要事迹
2014/02/01 职场文书
会计求职自荐信
2014/06/20 职场文书
中学生自我评价范文
2015/03/03 职场文书
元旦主持词开场白
2015/05/29 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
MySQL查询日期时间
2022/05/15 MySQL