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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
Feb 12 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
May 02 Javascript
js实现感应鼠标图片透明度变化的方法
Feb 20 Javascript
jquery实现网页定位导航
Aug 23 Javascript
Javascript中click与blur事件的顺序详析
Apr 25 Javascript
angular.extend方法的具体使用
Sep 14 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
让Vue也可以使用Redux的方法
May 23 Javascript
JS中数组与对象的遍历方法实例小结
Aug 14 Javascript
利用Node.js如何实现文件循环覆写
Apr 05 Javascript
小程序的上传文件接口的注意要点解析
Sep 17 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
第三节 定义一个类 [3]
2006/10/09 PHP
PHP生成指定长度随机数最简洁的方法
2014/07/14 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
ext 代码生成器
2009/08/07 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
简单实现JavaScript弹幕效果
2020/08/27 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
Python实现备份文件实例
2014/09/16 Python
利用Python如何生成随机密码
2016/04/20 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
Python 查看文件的读写权限方法
2018/01/23 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
python 并发编程 多路复用IO模型详解
2019/08/20 Python
Python 日期与时间转换的方法
2020/08/01 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
美国办公用品折扣网站:Shoplet.com
2019/11/24 全球购物
保护野生动物倡议书
2014/05/16 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
初中英语教师个人工作总结
2015/02/09 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
python 学习GCN图卷积神经网络
2022/05/11 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis