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弹出层插件简化版代码下载
Oct 16 Javascript
jquery控制listbox中项的移动并排序
Nov 12 Javascript
JavaScript中标识符提升问题
Jun 11 Javascript
jquery判断密码强度的验证代码
Apr 22 Javascript
AngularJs Injecting Services Into Controllers详解
Sep 02 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
EasyUI Combobox设置默认值 获取text的方法
Nov 28 Javascript
JavaScript实现多重继承的方法分析
Jan 09 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
May 10 Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 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
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
两个php日期控制类实例
2014/12/09 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
thinkphp分页实现效果
2016/10/13 PHP
PHP版单点登陆实现方案的实例
2016/11/17 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
jQuery插件开发全解析
2012/10/10 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
js实现表格字段排序
2014/02/19 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jquery选择器中的空格与大于号&gt;、加号+与波浪号~的区别介绍
2016/06/24 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
vue实现打印功能的两种方法
2018/09/07 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
python替换字符串中的子串图文步骤
2019/06/19 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python进度条显示之tqmd模块
2020/08/22 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
大三学生入党思想汇报
2014/01/02 职场文书
集团公司人力资源部岗位职责
2014/01/03 职场文书
住房租房协议书
2014/08/20 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
2015年植树节活动总结
2015/02/06 职场文书
公司内部升职自荐信
2015/03/27 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏