Angularjs实现多图片上传预览功能
作者:小疯疯0413
这篇文章主要介绍了Angularjs实现多图片上传预览功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
最近要实现一个多图片上传的预览功能,网上有很多例子大多不太完整,我就把他们的整合了下并且加了一些功能和界面,我们只需要调用一条指令就可以实现,但传给后台还需要额外的代码,会在后面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
}
最后给大家看下预览图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
- 原生JS实现前端本地文件上传
- JS实现可视化文件上传
- js实现文件上传功能 后台使用MultipartFile
- JS+Struts2多文件上传实例详解
- vue.js 图片上传并预览及图片更换功能的实现代码
- php+croppic.js实现剪切上传图片功能
- JavaScript使用享元模式实现文件上传优化操作示例
- JS实现图片上传多次上传同一张不生效的处理方法
- js实现图片上传并预览功能
- vue.js图片转Base64上传图片并预览的实现方法
- JavaScript实现异步图像上传功能
- SpringBoot+Vue.js实现前后端分离的文件上传功能
- node.js自动上传ftp的脚本分享
- JS实现的文件拖拽上传功能示例
- Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
- JS和Canvas实现图片的预览压缩和上传功能
- JavaScript代码实现txt文件的上传预览功能
- js 实现 input type="file" 文件上传示例代码
- js实现上传图片预览的方法
- Servlet+Jsp实现图片或文件的上传功能具体思路及代码
- 上传图片预览JS脚本 Input file图片预览的实现示例
- JS实现上传图片的三种方法并实现预览图片功能
- js实现图片上传并正常显示
- 一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
- JS中使用FormData上传文件、图片的方法
- 客户端js判断文件类型和文件大小即限制上传大小
- js获取上传文件的绝对路径实现方法
- 原生JS和jQuery版实现文件上传功能
- 微信JSSDK上传图片
- 简单实现js上传文件功能
- JS文件上传神器bootstrap fileinput详解
- js实现上传图片之上传前预览图片
- Javascript图片上传前的本地预览实例
- 学习使用AngularJS文件上传控件
- JS简单实现文件上传实例代码(无需插件)
- 分享5个好用的javascript文件上传插件
