AngularJS实现图片上传和预览功能的方法分析


Posted in Javascript onNovember 08, 2017

本文实例讲述了AngularJS实现图片上传和预览功能的方法。分享给大家供大家参考,具体如下:

html5原生方法

先看一下html5原生方法上传和预览图片的实现:

// <img id="img-preview">
var imgPreview = document.getElementById("img-preview");
// <input id="img-input" type="file">
var imgInput= document.getElementById("img-input");
imgInput.addEventListener("change", function(e){
 var imgFile = e.target.files[0]; // 获取上传的图片
 var reader = new FileReader();
 reader.readAsDataURL(imgFile ); // 将图片转成dataUri
 reader.onload = function(e) {
  imgPreview.src = e.target.result; //更新图片链接
 }
});

我们看到,需要用到onchange事件来获得上传的文件,当项目使用上angularjs时,很自然的,我们想到了ng-change指令,然而不幸的是,在angularjs中,<input type="file">不支持ng-model和ng-change指令(附录1),这就使得文件上传变得有些复杂了。

angularjs方法

这里使用开源的 angular-file-upload 模块来实现,步骤如下:

1、安装 angular-file-upload 模块

bower install angular-file-upload --save

2、添加到应用依赖

var app = angular.module('my-app', [
  'angularFileUpload'
]);

3、HTML代码

<!--文件上传指令-->
<input type="file" nv-file-select="" uploader="uploader" />
<!--图片预览-->
<img id="img-preview" ng-src="{{iconUrl}}">

这里,nv-file-select=""表示使用angular-file-upload模块的文件选择方式上传,参考官方例子

4、controller代码

.controller('AppController', ['$scope', 'FileUploader', function($scope, FileUploader) {
    var uploader = $scope.uploader = new FileUploader({
      url: 'upload.php' //换成自己的上传地址,本地演示不换也行
    });
    uploader.onAfterAddingFile = function(fileItem) {
      var reader = new FileReader();
      reader.addEventListener("load", function (e) {
        //文件加载完之后,更新angular绑定
        $scope.$apply(function(){
          $scope.iconUrl = e.target.result;
        });
      }, false);
      reader.readAsDataURL(fileItem._file);
    };
}]);

可以看到,我们通过onAfterAddingFile回调函数获得所选的图片文件,接下来把图片文件转成datauri,再更新<img>标签的src属性即可。

值得注意的是,我们把“更新<img>标签的src属性”这个任务放到了$scope.$apply方法中执行,这是因为在angular框架外部(如在浏览器DOM事件中, setTimeout, XHR 或者 第三方框架中)更新数据,angular是不会同步更新绑定的。这点可以参考angular $apply reference

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
JQuery跨Iframe选择实现代码
Aug 19 Javascript
入门基础学习 ExtJS笔记(一)
Nov 11 Javascript
javascript AOP 实现ajax回调函数使用比较方便
Nov 20 Javascript
JS图片自动轮换效果实现思路附截图
Apr 30 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 Javascript
Three.js学习之正交投影照相机
Aug 01 Javascript
JS打印组合功能
Aug 04 Javascript
AngularJS 过滤与排序详解及实例代码
Sep 14 Javascript
浅谈Web页面向后台提交数据的方式和选择
Sep 23 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
javascript 数组精简技巧小结
Feb 26 Javascript
three.js利用射线Raycaster进行碰撞检测
Mar 12 Javascript
javascript自定义事件功能与用法实例分析
Nov 08 #Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
Nov 08 #jQuery
ES6中javascript实现函数绑定及类的事件绑定功能详解
Nov 08 #Javascript
手把手教你使用vue-cli脚手架(图文解析)
Nov 08 #Javascript
vue中实现滚动加载更多的示例
Nov 08 #Javascript
详解使用webpack打包编写一个vue-toast插件
Nov 08 #Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 #Javascript
You might like
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
php实现通过soap调用.Net的WebService asmx文件
2017/02/27 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
jquery实现浮动的侧栏实例
2015/06/25 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
跟我学习javascript的执行上下文
2015/11/18 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
jQuery层次选择器用法示例
2016/09/09 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
Python操作MySQL数据库9个实用实例
2015/12/11 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
python实现比较文件内容异同
2018/06/22 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
python区块及区块链的开发详解
2019/07/03 Python
简单了解python中的与或非运算
2019/09/18 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python新手学习装饰器
2020/06/04 Python
Django配置跨域并开发测试接口
2020/11/04 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
初一体育教学反思
2014/01/29 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
房屋授权委托书范本
2014/10/07 职场文书
自我检讨书怎么写
2015/05/07 职场文书