微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

<div class="jb51code">
<pre class="brush:js;">
/**

  • 图片上传获取返回的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,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e) {
       return function () {
         s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.$apply(function () {
           deferred.reject(reader.result);
         });
       };
     };
    
     var getReader = function(deferred,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e) {
       var reader = new FileReader(); //fileReader
       reader.onload = onLoad(reader,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e);
       reader.onerror = onError(reader,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e);
       return reader;
     };
    
     var readAsDataURL = function (file,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e) {
       var deferred = $q.defer();
       var reader = getReader(deferred,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e);   
       reader.readAsDataURL(file);  
       return deferred.promise;
    
     };
    
     return {
       readAsDataUrl: readAsDataURL 

    };
    }])

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

<div class="jb51code">
<pre class="brush:js;">
/**

  • 图片上传预览
    */
    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){
         s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.$apply(function(){
           modelSetter(s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e,element[0].files[0]);
         });
         //附件预览         
            s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.imgupload = (event.srcElement || event.target).files[0];
            getFile(s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.imgupload,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e);
    
           //获得预览图地址并且把file对象放入<a href="https://www.jb51.cc/tag/shangchuan/" target="_blank" class="keywords">上传</a>合集内
            function getFile (imgupload,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e) {
              if(!imgupload) {
                return;
              }
              fileReader.readAsDataUrl(imgupload,s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e)
                     .then(function(result) {
                      s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.imgshows.push(result)
                      var file = document.querySelector('input[type=file]').files[0];
                      s<a href="https://www.jb51.cc/tag/cop/" target="_blank" class="keywords">cop</a>e.uploadimgs.push(file)//这里是放着传给<a href="https://www.jb51.cc/tag/houtai/" target="_blank" class="keywords">后台</a>的数据file,下面controller的时候会有
                     });
            };
       });
     }

    };
    }])

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

rush:js;"> app .directive('uploadimg',function () { return { restrict: 'E',scope: { uploadimgs: "=" },templateUrl: './js/directives/uploadimg/uploadimg.html',attrs) { scope.imgshows = []//预览图片合集放的是src scope.uploadimg_del = function(index,imgs) { scope.imgshows.splice(index,1); scope.uploadimgs.splice(index,1); } } } })

<div class="jb51code">
<pre class="brush:xhtml;">
<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%);
}

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

rush:xhtml;">

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

rush:js;"> $scope.uploadimgs = []//上传图片合集放的是file对象

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

<div class="jb51code">
<pre class="brush:js;">
$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:"<a href="https://www.jb51.cc/tag/houtaidizhi/" target="_blank" class="keywords">后台地址</a>",data: fd,headers: {'Content-Type':undefined},transformRequest: angular.identity
 })
 .success( function(response){
 //<a href="https://www.jb51.cc/tag/shangchuan/" target="_blank" class="keywords">上传</a>成功的操作

 });

}

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

最后给大家看下预览图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐