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 相关文章推荐
javascript GUID生成器实现代码
Oct 31 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
Jun 28 Javascript
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 Javascript
Jquery带搜索框的下拉菜单
May 06 Javascript
javascript级联下拉列表实例代码(自写)
May 10 Javascript
json属性名为什么要双引号(个人猜测)
Jul 31 Javascript
javascript实现依次输入input自动定焦
Dec 23 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
微信小程序 wxapp内容组件 progress详细介绍
Oct 31 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
Feb 21 Javascript
jQuery实现仿京东防抖动菜单效果示例
Jul 06 jQuery
swiper4实现移动端导航栏tab滑动切换
Oct 16 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 session机制
2011/07/17 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
PHP关于IE下的iframe跨域导致session丢失问题解决方法
2013/10/10 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
QQ登录简单实现代码
2021/03/09 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
JS按钮闪烁功能的实现代码
2017/07/21 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
Django学习之文件上传与下载
2019/10/06 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
HTML5文档结构标签
2017/04/21 HTML / CSS
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
法学专业毕业生自荐信范文
2013/12/18 职场文书
2014年公务员思想汇报范文:全心全意为人民服务
2014/03/06 职场文书
新闻发布会主持词
2014/03/28 职场文书
ktv好的活动方案
2014/08/17 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
大学团日活动总结书
2015/05/11 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
如何利用STAR法则制作留学文书?
2019/08/26 职场文书
MySQL分库分表详情
2021/09/25 MySQL
bootstrapv4轮播图去除两侧阴影及线框的方法
2022/02/15 HTML / CSS
python套接字socket通信
2022/04/01 Python