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 相关文章推荐
javascript中数组的冒泡排序使用示例
Dec 18 Javascript
js如何改变文章的字体大小
Jan 08 Javascript
node.js从数据库获取数据
May 08 Javascript
JavaScript遍历求解数独问题的主要思路小结
Jun 12 Javascript
js中json处理总结之JSON.parse
Oct 14 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
Node.js 基础教程之全局对象
Aug 06 Javascript
微信小程序之GET请求的实例详解
Sep 29 Javascript
详解vue中router-link标签所必备了解的属性
Apr 15 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
May 13 Javascript
layui导出所有数据的例子
Sep 10 Javascript
教你如何用Node实现API的转发(某音乐)
Sep 20 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
用PHP实现验证码功能
2006/10/09 PHP
PHP中的cookie
2006/11/26 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
《PHP编程最快明白》第五讲:php目录、文件操作
2010/11/01 PHP
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
PHP 图片处理
2020/09/16 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
Javascript 面向对象 命名空间
2010/05/13 Javascript
基于Unit PNG Fix.js有时候在ie6下不正常的解决办法
2013/06/26 Javascript
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
jQuery插件multiScroll实现全屏鼠标滚动切换页面特效
2015/04/12 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
详解VUE中常用的几种import(模块、文件)引入方式
2018/07/03 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
python数据爬下来保存的位置
2020/02/17 Python
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
德国滑雪和户外用品网上商店:XSPO
2019/10/30 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
护理专业优质毕业生自荐书
2014/01/31 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
财务管理专业自荐书
2014/09/02 职场文书
老乡聚会通知
2015/04/23 职场文书
Python数据可视化之绘制柱状图和条形图
2021/05/25 Python