Angularjs实现多图片上传预览功能


Posted in Javascript onJuly 18, 2018

最近要实现一个多图片上传的预览功能,网上有很多例子大多不太完整,我就把他们的整合了下并且加了一些功能和界面,我们只需要调用一条指令就可以实现,但传给后台还需要额外的代码,会在后面controller里介绍。不知道封装的是否符合标准,还希望大家一起讨论下,如果有时间封装下Angular4的图片上传和预览分享给大家。

图片上传的预览,我们最主要解决的是拿到input的on-change事件,再是读取图片,读取图片我们需要用到FileReader。

我们先写一个读取图片的服务,这是网上的一位大佬写的,我就直接拿了过来

/**
 * 图片上传获取返回的url
 */
      app .factory('fileReader', ["$q", "$log", function($q, $log){
        var onLoad = function(reader, deferred, scope) {
          return function () {
            scope.$apply(function () {
              deferred.resolve(reader.result);
            });
          };
        };

        var onError = function (reader, deferred, scope) {
          return function () {
            scope.$apply(function () {
              deferred.reject(reader.result);
            });
          };
        };

        var getReader = function(deferred, scope) {
          var reader = new FileReader(); //fileReader
          reader.onload = onLoad(reader, deferred, scope);
          reader.onerror = onError(reader, deferred, scope);
          return reader;
        };

        var readAsDataURL = function (file, scope) {
          var deferred = $q.defer();
          var reader = getReader(deferred, scope);   
          reader.readAsDataURL(file);  
          return deferred.promise;

        };

        return {
          readAsDataUrl: readAsDataURL 
      };
}])

我们现在有了图片的读取,我们再来搞定图片的on-change事件

/**
 * 图片上传预览
 */
app .directive('file', ['$parse', 'fileReader', function ($parse, fileReader) { 
      return {
        restrict: 'A',
        link: function(scope, element, attrs, ngModel) {

          var model = $parse(attrs.file);
          var modelSetter = model.assign;
          console.log(modelSetter)
          element.bind('change', function(event){
            scope.$apply(function(){
              modelSetter(scope, element[0].files[0]);
            });
            //附件预览         
               scope.imgupload = (event.srcElement || event.target).files[0];
               getFile(scope.imgupload, scope);

              //获得预览图地址并且把file对象放入上传合集内
               function getFile (imgupload, scope) {
                 if(!imgupload) {
                   return;
                 }
                 fileReader.readAsDataUrl(imgupload, scope)
                        .then(function(result) {
                         scope.imgshows.push(result)
                         var file = document.querySelector('input[type=file]').files[0];
                         scope.uploadimgs.push(file)//这里是放着传给后台的数据file,下面controller的时候会有
                        });
               };
          });
        }
      };
    }])

这里就是提供上传图片预览的样式,还有预览图删除的功能

app .directive('uploadimg', function () { 
      return {
        restrict: 'E', 
        scope: {
          uploadimgs: "="
        },
        templateUrl: './js/directives/uploadimg/uploadimg.html',      
        link: function(scope, element, attrs) {
            scope.imgshows = []//预览图片合集放的是src    
            scope.uploadimg_del = function(index,imgs) {  
                scope.imgshows.splice(index,1);
                scope.uploadimgs.splice(index,1);
      }
     }
 }
})
<style type="text/css">
.fileupload {
  width: 100px;
  height: 100px;
  border: 1px dotted #ccc;
  display: inline-block;
}
.fileupload-icon {
  font-size:32px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}
</style>
<div>
  <div class="fileupload pos-rlt" ng-repeat="imageSrc in imgshows">
    <img ng-src="{{imageSrc}}" style="max-width:200px;max-height:300px;margin:0 auto; display:block;" class="pos-rlt" width=100%; height=100%;/>
    <i class="icon ion-close-circled" style="position: absolute; top:5px; right: 5px" ng-click="uploadimg_del($index, imgshows)"></i>
  </div>
  <div class="fileupload pos-rlt clear" >
    <i class="icon ion-plus-round fileupload-icon"></i>
    <input type="file" style="display:inline-block; width: 100%; height: 100%; opacity:0" name="upload_img" file="upload_img" placeholder="选择图片" accept="image/png,image/gif,image/jpeg,image/jpg"  >
  </div>
</div>
</label>

最后的调用也很简单
我们只需要在2个地方加代码一个是在界面,一个是在Controller里

<uploadimg uploadimgs="uploadimgs"></uploadimg>

这个是在Controller里的,这是用来传给后台的数据集合,我们需要传给后台的是file对象

$scope.uploadimgs = []//上传图片合集放的是file对象

如何传给后台呢,直接附上代码,其实不难

$scope.save = function() {     
    var Fromdata = {
      'name': $scope.form.name,
      'desc': $scope.form.descr,
      'price': $scope.form.price,
      'status': $scope.form.status?1:0,

    }
    var uploadData = createFromData(Fromdata)
    for(var i = 0; i < $scope.uploadimgs.length; i++) {
      uploadData.append('upload_imgs', $scope.uploadimgs[i])
    }

     $http({
     method:'POST',
     url:"后台地址",
     data: fd,
     headers: {'Content-Type':undefined},
     transformRequest: angular.identity
     })
     .success( function(response){
     //上传成功的操作

     });

   }  

//构造FormData
//@param 是一个对象
function createFromData(Fromdata) {
   var fd = new FormData();
   for(key in Fromdata) {
     fd.append(key,Fromdata[key]); 
   }
   return fd
}

最后给大家看下预览图

Angularjs实现多图片上传预览功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery EasyUI API 中文文档 - ValidateBox验证框
Oct 06 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
Apr 02 Javascript
js自动下载文件到本地的实现代码
Apr 28 Javascript
node.js实现逐行读取文件内容的代码
Jun 27 Javascript
JavaScript的arguments对象应用示例
Sep 15 Javascript
JavaScript实现汉字转换为拼音的库文件示例
Dec 22 Javascript
jQuery DateTimePicker 日期和时间插件示例
Jan 22 Javascript
Javascript下拉刷新的简单实现
Feb 14 Javascript
基于Node的React图片上传组件实现实例代码
May 10 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
JS面向对象编程——ES6 中class的继承用法详解
Mar 03 Javascript
JS async 函数的含义和用法实例总结
Apr 08 Javascript
JavaScript实现正则去除a标签并保留内容的方法【测试可用】
Jul 18 #Javascript
微信小程序scroll-x失效的完美解决方法
Jul 18 #Javascript
详解easyui基于 layui.laydate日期扩展组件
Jul 18 #Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 #Javascript
微信小程序修改swiper默认指示器样式的实例代码
Jul 18 #Javascript
webpack4.x打包过程详解
Jul 18 #Javascript
vue系列之requireJs中引入vue-router的方法
Jul 18 #Javascript
You might like
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
Php连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
php绘制一条弧线的方法
2015/01/24 PHP
php实现计算百度地图坐标之间距离的方法
2016/05/05 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
layui select 禁止点击的实现方法
2019/09/05 Javascript
Vue实现剪切板图片压缩功能
2020/02/04 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
机器学习10大经典算法详解
2017/12/07 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
python flask框架实现重定向功能示例
2019/07/02 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
python如何运行js语句
2020/09/09 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
苹果台湾官网:Apple台湾
2019/01/05 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
优秀干部获奖感言
2014/01/31 职场文书
税务会计岗位职责
2014/02/18 职场文书
计算机系本科生求职信
2014/05/31 职场文书
建设工程授权委托书
2014/09/22 职场文书
中标通知书
2015/04/17 职场文书
2015年副班长工作总结
2015/05/15 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL
Python中的变量与常量
2021/11/11 Python
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python