基于AngularJS的拖拽文件上传的实例代码


Posted in Javascript onJuly 15, 2017

随着HTML5的普及,现在大部分浏览器都支持拖拽功能,今天我们要说的就是实现一套拖拽上传的功能(Angularjs+nodejs)。

一、首先前端这款插件是基于AngularJS的,下面我们来看主要代码。

引入js:

<script src="js/angular.1.3.15.min.js"></script>
<script src="js/ng-file-upload-shim.min.js"></script>
<script src="js/ng-file-upload.min.js"></script>

html:

<div class="block__list block__list_words" ng-controller="UploadController">
  <div ngf-drop ng-model="files" class="drop-box" ngf-drag-over-class="dragover" ngf-multiple="true" ngf-allow-dir="true" ngf-accept="'.jpg,.png,.pdf,.html,.zip'">//上传文件的格式
    <div class="progressbar" ng-show="showProgress">
      <div ng-repeat="file in files" class="uploadInfo">
        <div class="fileName col-sm-5 col-xs-6">{{file.name}}</div>
        <div class="divProgressbar{{$index}} col-sm-5 col-xs-4"></div>
        <div class="col-sm-2 col-xs-2">
          <i class="fa fa-trash fontIcon" ng-click="delFile($index)"></i>
        </div>
      </div>
    </div>
    <div ng-hide="showProgress">
      <div class="import import1">You may also import your own translation</div>
      <div class="import import2">memories(TMX)</div>
      <div class="import import3">or</div>
    </div>
 
    <div class="btn addFiles" ngf-select ng-model="files">
      <i class="fa fa-plus-circle"></i>
      Add files...
    </div>
  </div>
  <div ngf-no-file-drop>File Drag/Drop is not supported for this browser</div>
 
  Image thumbnail:
  <div ng-sortable="{ group: 'foobar' }">//调整上传后图片顺序
    <img ng-repeat="file in files" ngf-src="file">
  </div>
</div>

js:

(function () {
  'use strict';
  angular.module('todoApp', ['ng-sortable','ngFileUpload'])
  .controller('UploadController', ['$scope','Upload', function ($scope,Upload) {
   $scope.showProgress = false;
 
   $scope.$watch('files', function () {
    $scope.upload($scope.files);
   });//监听files有改变就上传
 
   $scope.upload = function (files) {
    if (files && files.length) {
     for (var i = 0; i < files.length; i++) {
      var file = files[i];
      (function(i){
        return Upload.upload({
         url: '/upload',
        fields: {'username': $scope.username},
        file: file
       }).progress(function (evt) {
        $scope.showProgress = true;
        var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);//上传百分比
        console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
       }).success(function (data, status, headers, config) {
        $scope.showProgress = true;
        var url = data.url;
        $scope.files[i].url = url;
        console.log('file ' + config.file.name + 'uploaded. Response: ', data);
        console.log("size:" + (config.file.size/1000).toFixed(2));//一个文件上传成功
       });
      })(i)
     }
    }
   };
  }])
})();

二、然后是我们的后台代码:

1、app.js中设定上传文件缓存地址

var multiparty = require('connect-multiparty');
var config = require('./config').config;
app.use(multiparty({
  uploadDir: path.join(config.upload_dir)
}));

2、上传代码:

exports.uploadImage = function (req, res, next) {
 /*if (!req.session || !req.session.user) {
  res.send({ status: 'forbidden' });
  return;
 }*/
 var file = req.files && req.files.file;
 if (!file) {
  res.send({ status: 'failed', message: 'no file' });
  return;
 }
 //var uid = req.session.user._id.toString();
  var uid = "stone";
 var userDir = path.join(config.upload_dir, uid);
 ndir.mkdir(userDir, function (err) {
  if (err) {
   return next(err);
  }
  var filename = Date.now() + '_' + file.name;
  var savepath = path.resolve(path.join(userDir, filename));
  if (savepath.indexOf(path.resolve(userDir)) !== 0) {
   return res.send({status: 'forbidden'});
  }
  fs.rename(file.path, savepath, function (err) {
   if (err) {
    return next(err);
   }
   var url = '/upload/' + uid + '/' + encodeURIComponent(filename);
   res.send({ status: 'success', url: url });
  });
 });
};

三、调节图片顺序

加入Sortable插件用来拖拽调整上传图片的先后位置

1、引入js:

<script src="Sortable.min.js"></script>
<script src="ng-sortable.js"></script>

2、html代码:

<div ng-sortable="{ group: 'foobar' }">//调整上传后图片顺序
  <img ng-repeat="file in files" ngf-src="file">
</div>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js原型链原理看图说明
Jul 07 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
Mar 04 Javascript
JQuery显示、隐藏div的几种方法简明总结
Apr 16 Javascript
JavaScript常用函数工具集:lao-utils
Mar 01 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
node.js中cluster的使用教程
Jun 09 Javascript
bootstrap Table的一些小操作
Nov 01 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 Javascript
浅谈layer弹出层按钮颜色修改方法
Sep 11 Javascript
微信小程序服务器日期格式化问题
Jan 07 Javascript
Javascript实现时间倒计时效果
Jul 15 #Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
Jul 15 #Javascript
JavaScript实现时间表动态效果
Jul 15 #Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
Jul 15 #Javascript
JavaScript实现三级联动效果
Jul 15 #Javascript
BackBone及其实例探究_动力节点Java学院整理
Jul 14 #Javascript
backbone简介_动力节点Java学院整理
Jul 14 #Javascript
You might like
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
PHP加密解密类实例代码
2016/07/20 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
PHP面向对象程序设计之对象的遍历操作示例
2019/06/12 PHP
PHP进阶学习之垃圾回收机制详解
2019/06/18 PHP
PHP生成随机字符串实例代码(字母+数字)
2019/09/11 PHP
分页栏的web标准实现
2011/11/01 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
javascript实现连续赋值
2015/08/10 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python中函数的多种格式和使用实例及小技巧
2015/04/13 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
python读取大文件越来越慢的原因与解决
2019/08/08 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
利用CSS3实现进度条的两种姿势详解
2017/03/21 HTML / CSS
美国时尚女装在线:Missguided
2016/12/03 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
学生就业推荐信
2013/11/13 职场文书
校长就职演讲稿
2014/01/06 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
体育专业学生自我评价范文
2014/01/17 职场文书
小学生自我评价范文
2014/01/25 职场文书
静心口服夜广告词
2014/03/20 职场文书
Elasticsearch 索引操作和增删改查
2022/04/19 Python