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陷阱 一不小心你就中招了(字符运算)
Nov 10 Javascript
jQuery实现下拉框左右选择的简单实例
Feb 22 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
Apr 30 Javascript
jQuery中bind()方法用法实例
Jan 19 Javascript
Javascript中Array用法实例分析
Jun 13 Javascript
有关JavaScript中call()和apply() 的一些理解
May 20 Javascript
Angular2自定义分页组件
Apr 19 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
Nov 03 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
javascript使用正则实现去掉字符串前面的所有0
Jul 23 Javascript
浅谈一个webpack构建速度优化误区
Jun 24 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
攻克CakePHP系列一 连接MySQL数据库
2008/10/22 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
客户端js判断文件类型和文件大小即限制上传大小
2013/11/20 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
Python中的迭代器漫谈
2015/02/03 Python
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python3控制路由器——使用requests重启极路由.py
2016/05/11 Python
Python函数式编程
2017/07/20 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
python绘制趋势图的示例
2020/09/17 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
五年级数学教学反思
2014/02/11 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
教师考察材料范文
2014/06/03 职场文书
村安全生产责任书
2014/08/25 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
《学会看病》教学反思
2016/02/17 职场文书
导游词之桂林
2019/08/20 职场文书
Python OpenCV实现传统图片格式与base64转换
2021/06/13 Python