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 面向对象继承
Nov 26 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
May 21 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
javascript复制粘贴与clipboardData的使用
Oct 16 Javascript
js实现简洁的TAB滑动门效果代码
Sep 06 Javascript
Javascript中的几种继承方式对比分析
Mar 22 Javascript
jquery获取复选框checkbox的值实现方法
May 30 Javascript
JavaScript实现通过select标签跳转网页的方法
Sep 29 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
AngularJS路由切换实现方法分析
Mar 17 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
js实现3D旋转效果
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获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
jQuery实用函数用法总结
2014/08/29 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
在Create React App中使用CSS Modules的方法示例
2019/01/15 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
用Python实现一个简单的线程池
2015/04/07 Python
Python中的模块和包概念介绍
2015/04/13 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
深入理解NumPy简明教程---数组2
2016/12/17 Python
python实现感知器算法(批处理)
2019/01/18 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
css3高级选择器使用方法
2013/12/02 HTML / CSS
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
工业自动化专业毕业生推荐信
2013/11/18 职场文书
幼师自荐信范文
2015/03/06 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
使用css样式设计一个简单的html登陆界面的实现
2021/03/30 HTML / CSS
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
与Windows10相比Windows11有哪些改进?值不值得升级?
2021/11/21 数码科技