基于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扩展Array.prototype.indexOf引发的问题及解决办法
Jan 21 Javascript
JavaScript中的Math.LN2属性用法详解
Jun 12 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
Dec 10 Javascript
深入理解JavaScript中的浮点数
May 18 Javascript
Angular.js自定义指令学习笔记实例
Feb 24 Javascript
利用n工具轻松管理Node.js的版本
Apr 21 Javascript
JavaScript禁止微信浏览器下拉回弹效果
May 16 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
Sep 27 jQuery
vue 组件开发原理与实现方法详解
Nov 29 Javascript
vue+Element-ui前端实现分页效果
Nov 15 Javascript
Vue项目利用axios请求接口下载excel
Nov 17 Vue.js
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中的日期及时间
2006/11/23 PHP
PHP写MySQL数据 实现代码
2009/06/15 PHP
Laravel使用RabbitMQ的方法示例
2019/06/18 PHP
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
js 处理数组重复元素示例代码
2013/12/27 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
jQuery判断对象是否存在的方法
2015/02/05 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
JavaScript如何动态创建table表格
2020/08/02 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
垃圾回收器的相关知识点总结
2018/05/13 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
vue3.0 上手体验
2020/09/21 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
python机器学习实战之K均值聚类
2017/12/20 Python
Python函数的定义方式与函数参数问题实例分析
2019/12/26 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
关于探究python中sys.argv时遇到的问题详解
2021/02/23 Python
意大利值得信赖的在线超级药房:PillolaStore
2020/02/05 全球购物
英语商务邀请函范文
2014/01/16 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis
Python 视频画质增强
2022/04/28 Python
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS