成果图:

main-hugeScreen.html

<div class="hbox hbox-auto-xs hbox-auto-sm" ng-controller="HugeScreenCtrl">
<!--div ng-controller="HugeScreenCtrl">
<div class="col w-lg bg-light b-r bg-auto">
<div class="wrapper-md dker b-b">
<h3 class="m-n font-thin">选择文件</h3>
</div>
<div class="wrapper-md">
<p>多个文件</p>
<input type="file" multiple/>
<p class="m-t-md">单个文件</p>
<input type="file"/>
</div>
</div>
<div>
<input type="file" file-model="myFile" multiple/>
<button ng-click="uploadFile()">upload me</button>
</div>
</div-->
<div class="col w-lg bg-light b-r bg-auto">
<div class="wrapper-md dker b-b">
<h3 class="m-n font-thin">Select files</h3>
</div>
<div class="wrapper-md">
<div ng-show="true" class="m-b-md">
<!-- 3. nv-file-over uploader="link" over-class="className" -->
<div file-dropzone="[image/png, image/jpeg, image/gif]"
files="myFile" over-class='b-danger' data-max-file-size="3" class="b-a b-2x b-dashed wrapper-lg bg-white text-center m-b">
Base drop zone
</div> <!-- Example: nv-file-drop="" uploader="{Object}" options="{Object}" filters="{String}" -->
<div>
<div file-dropzone="[image/png, image/jpeg, image/gif]"
files="myFile" over-class='b-info' data-max-file-size="3" active="redColorActive" class="b-a b-2x b-dashed wrapper-lg lter text-center" >
Another drop zone with its own settings
</div>
</div>
</div> <!-- Example: nv-file-select="" uploader="{Object}" options="{Object}" filters="{String}" -->
<p>Multiple</p>
<input type="file" file-model="myFile" multiple/> <p class="m-t-md">Single</p>
<input type="file" file-model="myFile"/>
</div>
</div>
<div class="col">
<div class="wrapper-md bg-light dk b-b">
<span class="pull-right m-t-xs">Queue length: <b class="badge bg-info">{{myFile.length}}</b></span>
<h3 class="m-n font-thin">Upload queue</h3>
</div>
<div class="wrapper-md">
<table class="table bg-white-only b-a">
<thead>
<tr>
<th width="30%">缩略图</th>
<th width="30%">Name</th>
<th ng-show="true">Size</th>
<th ng-show="true">Progress</th>
<th>Status</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in myFile">
<!--td><img ng-src={{item.stream}}/></td-->
<td><img ng-src={{item.stream}} style="max-width: 200px; max-height: 200px"/></td>
<td><strong>{{ item.file.name }}</strong></td>
<td ng-show="true" nowrap>{{ item.file.size/1024/1024|number:2 }} MB</td>
<td ng-show="true">
<div class="progress progress-sm m-b-none m-t-xs">
<div class="progress-bar bg-info" role="progressbar" ng-style="{ 'width': item.progress + '%' }"></div>
</div>
</td>
<td class="text-center">
<span ng-show="item.isSuccess" class="text-success"><i class="glyphicon glyphicon-ok"></i></span>
<span ng-show="item.isCancel" class="text-warning"><i class="glyphicon glyphicon-ban-circle"></i></span>
<span ng-show="item.isError" class="text-danger"><i class="glyphicon glyphicon-remove"></i></span>
</td>
<td nowrap>
<button type="button" class="btn btn-default btn-xs" ng-click="item.upload(item)" ng-disabled="item.isReady || item.isUploading || item.isSuccess">
Upload
</button>
<button type="button" class="btn btn-default btn-xs" ng-click="removeItem($index)">
Remove
</button>
</td>
</tr>
</tbody>
</table>
<div>
<div>
<p>Queue progress:</p>
<div class="progress bg-light dker" style="">
<div class="progress-bar progress-bar-striped bg-info" role="progressbar" ng-style="{ 'width': allprogress + '%' }"></div>
</div>
</div>
<button type="button" class="btn btn-addon btn-success" ng-click="uploadAllfiles(allprogress)">
<i class="fa fa-arrow-circle-o-up"></i> Upload all
</button>
<button type="button" class="btn btn-addon btn-warning" ng-click="cancelAll()" ng-disabled="!myFile.isUploading">
<i class="fa fa-ban"></i> Cancel all
</button>
<button type="button" class="btn btn-addon btn-danger" ng-click="clearQueue()" ng-disabled="!myFile.length">
<i class="fa fa-trash-o"></i> Remove all
</button>
<p class="text-muted m-t-xl">Note: upload.php file included, files will be uploaded to "src/js/controllers/uploads".</p>
</div>
<div>
<table><thead><tr><th>缩略图</th></tr></thead><tbody>
<tr ng-repeat="item in image track by $index">
<td>
<img ng-src={{item}} />
</td>
</tr>
</tbody></table> <!-- <span class="file-name">{{imageFileName}}</span>-->
</div>
</div>
</div>
</div>

bjt-imageload-service.js

/**
* Created by chaiqiaozhen on 10/6/15.
*/
app.service('fileReader', function ($q) { var fileReader = this;
fileReader.onLoad = function(file, reader,deferred, scope) {
return function () {
scope.$apply(function () {
var ret = {
srcfile: file,
stream: reader.result
};
deferred.resolve(ret);
});
};
}; fileReader.onError = function (reader, deferred, scope) {
return function () {
scope.$apply(function () {
deferred.reject(reader.result);
});
};
}; fileReader.onProgress = function(reader, scope) {
return function (event) {
scope.$broadcast("fileProgress",
{
total: event.total,
loaded: event.loaded
});
};
}; fileReader.getReader = function(file,deferred, scope) {
var reader = new FileReader();
reader.onload = fileReader.onLoad(file, reader,deferred, scope);
reader.onerror = fileReader.onError(reader, deferred, scope);
reader.onprogress = fileReader.onProgress(reader, scope);
return reader;
}; fileReader.readMyAsDataURL = function (file, scope) {
var deferred = $q.defer(); var reader = fileReader.getReader(file, deferred, scope);
reader.readAsDataURL(file); return deferred.promise;
}; });

hugeScreen-service.js

app.directive('fileDropzone', ['$bjtHttpService','fileReader',function($bjtHttpService,fileReader) {
return {
restrict: 'A',
scope: {
files: '=',
overClass: '='
},
link: function(scope, element, attrs) {
var checkSize, isTypeValid, processDragOverOrEnter, validMimeTypes,getDataTransfer,addfile;
var fileList = [];
addfile = function(item){
fileList[fileList.length] = item;
}
getDataTransfer = function(event) {
var dataTransfer;
return dataTransfer = event.dataTransfer || event.originalEvent.dataTransfer;
};
processDragOverOrEnter = function(event) {
if (event != null) {
event.preventDefault();
}
getDataTransfer(event).effectAllowed = 'copy';
element.addClass(attrs.overClass); // console.log(element);
return false;
};
validMimeTypes = attrs.fileDropzone;
checkSize = function(size) {
var _ref;
if (((_ref = attrs.maxFileSize) === (void 0) || _ref === '') || (size / 1024) / 1024 < attrs.maxFileSize) {
return true;
} else {
alert("File must be smaller than " + attrs.maxFileSize + " MB");
return false;
}
};
isTypeValid = function(type) {
if ((validMimeTypes === (void 0) || validMimeTypes === '') || validMimeTypes.indexOf(type) > -1) {
return true;
} else {
alert("Invalid file type. File must be one of following types " + validMimeTypes);
return false;
}
};
element.bind('dragover', processDragOverOrEnter);
element.bind('dragenter', processDragOverOrEnter);
return element.bind('drop', function(event) {
var files;
if (event != null) {
event.preventDefault();
}
element.removeClass(attrs.overClass);
fileList = [];
files = getDataTransfer(event).files;
for(var i = 0; i < files.length; i++){
if(!isTypeValid(files[i].type))
return false;
if(!checkSize(files[i].size))
return false;
/* var reader = new FileReader();
reader.onload = function(reader,evt){
console.log(reader);
};
reader.readAsDataURL(files[i]);*/
/* fileReader.readMyAsDataURL(files[i],scope).then(
function(ret){
console.log(ret);
});*/
fileReader.readMyAsDataURL(files[i], scope)
.then(function(ret) {
var file = {
isSuccess: false,
isCancel: false,
isError: false,
progress: 0,
isReady: false,
isUploading: false,
file: ret.srcfile,
stream: ret.stream,
upload: function (item) { var options = {
headers: {'Content-Type': undefined},
callbackError: function(args,data){
item.isError = true;
},
callbackSuccess: function(args,data){
item.isSuccess = true;
item.progress = 100;
console.log(this.isSuccess);
}
};
var addOptions = {
transformRequest: angular.identity
};
var fd = new FormData();
fd.append('file', this.file);
$bjtHttpService.$post('demo/file/upload',fd,options,addOptions);
}
};
addfile(file);
});
}
scope.files = fileList;
return false;
});
}
};
}]);
app.directive('fileModel', ['$parse', '$bjtHttpService', function ($parse, $bjtHttpService) {
return {
restrict: 'A',
link: function(scope, element, attrs) {
var model = $parse(attrs.fileModel);
var modelSetter = model.assign;
var filelist = [];
element.bind('change', function(){
scope.$apply(function(){
for(var i = 0; i < element[0].files.length; i++){
var file = {
isSuccess: false,
isCancel: false,
isError: false,
progress: 0,
isReady: false,
isUploading: false,
file: element[0].files[i],
fileStream: null,
upload: function (item) { var options = {
headers: {'Content-Type': undefined},
callbackError: function(args,data){
item.isError = true;
},
callbackSuccess: function(args,data){
item.isSuccess = true;
item.progress = 100;
console.log(this.isSuccess);
}
};
var addOptions = {
transformRequest: angular.identity
};
var fd = new FormData();
fd.append('file', this.file);
$bjtHttpService.$post('demo/file/upload',fd,options,addOptions);
}
};
filelist[i] = file;
} modelSetter(scope, filelist);
});
});
}
};
}]); app.controller('HugeScreenCtrl', ['$scope', 'fileReader', function($scope, fileReader) { $scope.allprogress=0;
$scope.myFile = '';
$scope.image= null;
$scope.imageFileName = '';
$scope.redColorActive = 'false';//'b-danger';
$scope.removeItem = function(index){
$scope.myFile.splice(index, 1);
};
$scope.getNotUploadedItems = function () {
var files = [];
for(var i = 0, j = 0; i < $scope.myFile.length; i++){
if(!$scope.myFile[i].isSuccess)
files[j++] = $scope.myFile[i];
}
return files;
};
$scope.getImage = function(item){
fileReader.readMyAsDataURL(item, $scope)
.then(function(result) {
return result;
});
};
$scope.uploadAllfiles = function(){
$scope.allprogress = 0.0;
console.log($scope.allprogress); var percent = 0;
if($scope.myFile.length > 0)
percent = 100/$scope.myFile.length;
console.log(percent);
for( var i = 0; i < $scope.myFile.length; i++) {
if($scope.myFile[i].isSuccess)
$scope.allprogress = $scope.allprogress+ percent;
else{
$scope.myFile[i].upload($scope.myFile[i]);
if($scope.myFile[i].isSuccess)
$scope.allprogress = $scope.allprogress+ percent;
}
console.log($scope.allprogress);
}
};
}]);

angularjs 实现 文件拖拽,缩略图显示的更多相关文章

  1. VC实现文件拖拽OnDropFiles

    文章转自http://blog.csdn.net/zamaolangzi/article/details/5645284 使用过QQ的人都知道,只要把文件拖拽到消息框中就可以传送文件了.那么这种功能是 ...

  2. C#之winform实现文件拖拽功能

    将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了 将一个控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter ...

  3. Linux下安装VMware Tools(使虚拟机支持文件拖拽)

    如图点击虚拟机找到安装VMware Tools选项,点击后会在虚拟机桌面显示一个光盘,双击进入如下页面: 选择压缩包将其复制放入Home中不带中文的文件夹: 打开终端,输入cd命令进入文件夹,将压缩包 ...

  4. Web存储及文件拖拽

    存储 实现内容的永久保存(localStorage) 保存: localStorage.自定义键名="123"; 获取: //判断是否有内容 if(localStorage.自定义 ...

  5. C# 之文件拖拽和pixturBox缩放与拖拽

    文件拖拽: 效果:将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了. 将一个控件的属性AllowDrop设置为true,然后添加DragDrop ...

  6. C#之winform实现文件拖拽功能【转】

    将一个文件拖拽到窗体的某个控件时,将该控件的路径显示在该控件上,只要拿到了路径自然可以读取文件中的内容了 将一个控件的属性AllowDrop设置为true,然后添加DragDrop.DragEnter ...

  7. html5 文件拖拽上传

    本文首先发表在  码蜂笔记 : http://coderbee.net/index.php/web/20130703/266 html5 文件拖拽上传是个老话题了,网上有很多例子,我一开始的代码也是网 ...

  8. html5 drag 文件拖拽浅淡

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. php和js实现文件拖拽上传

    Dropzone.js实现文件拖拽上传 http://www.sucaihuo.com/php/1399.html demo http://www.sucaihuo.com/jquery/13/139 ...

随机推荐

  1. c_test

    1.int a[][4]={0,0};与int a[3][4] = {0}; 元素不够的就以位模式初始化为0 a[第一维][第二维] 的大小,也就是最多存几个 int a[][3]={1,2,3,4, ...

  2. 当ListView有Header时,onItemClick里的position不正确

    原文:http://blog.chengbo.net/2012/03/09/onitemclick-return-wrong-position-when-listview-has-headerview ...

  3. CSS3–1.css3 新增选择器

    1.后代级别选择器 2.同辈级别选择器 3.伪类选择器 4.属性选择器 5.UI伪类选择器 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T ...

  4. mxnet环境搭建随记

    安装mxnet还是遇到不少麻烦事,现在简单记一下,挖个坑,后续详细补充,打算写一下我的mxnet探索之旅. 更新: 具体安装mxnet,cuda,opencv过程已经补坑——点击进入 不知道为什么,在 ...

  5. Linux系统启动过程分析

    [原创]Linux系统启动过程分析-wjlkoorey258-ChinaUnix博客http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对 ...

  6. 解决mysql无法插入中文数据及插入后显示乱码的问题

    (1)废话不多说就是使用mysql数据库的时候无法输入中文,可以输入中文后显示的又是乱码!! (2开始解决问题: 第一步:找到安装mysql的目录找到 my.ini 文件: 第二步:使用记事本打开my ...

  7. UVA 10828 Back to Kernighan-Ritchie(高斯消元)

    高斯消元求概率 对于非起点,期望x[i] = ∑x[j] / deg[j] #include<cstdio> #include<iostream> #include<cs ...

  8. Linux發送郵件

    1.直接使用shell當編輯器 [root@phburdb1 mail]# mail -s "Hello World" juncai.chen@innolux.comHello j ...

  9. phpcms v9网站搬家更换域名的方法

    PHPCMS 是国内领先的网站管理系统,同时也是一个开源的PHP开发框架. 本文介绍phpcms v9网站搬家更换域名的方法. 1.在新的主机空间把phpcms安装好. 新安装的版本一定要和准备搬迁的 ...

  10. ubuntu wubi非在线快速安装

    最近ubuntu更新了,就想把它重新装回来试一下,但是由于种种原因划分磁盘不太方便,很自然就想到了wubi,这个不仅仅安全性高,而且比直接装系统快多了,而且方便.但是在线安装实在是太慢了,所以就找到了 ...