基于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 相关文章推荐
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
Oct 19 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
Aug 29 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
Feb 01 Javascript
jquery实现人性化的有选择性禁用鼠标右键
Jun 30 Javascript
jQuery实现的淡入淡出二级菜单效果代码
Sep 15 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
Jun 28 Javascript
jquery validation验证表单插件
Jan 07 Javascript
JS中的回调函数实例浅析
Mar 21 Javascript
webpack4.x CommonJS模块化浅析
Nov 09 Javascript
微信小程序自定义头部导航栏(组件化)
Nov 15 Javascript
threejs太阳光与阴影效果实例代码
Apr 05 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
如何在WIN2K下安装PHP4.04
2006/10/09 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
Pycharm 设置默认头的图文教程
2019/01/17 Python
python实现远程控制电脑
2019/05/23 Python
python操作文件的参数整理
2019/06/11 Python
python基于递归解决背包问题详解
2019/07/03 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
np.dot()函数的用法详解
2020/01/17 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
全球知名巧克力品牌:Godiva
2016/07/22 全球购物
Shein英国:女性时尚网上商店
2019/04/10 全球购物
中学生自我评价2015
2015/03/03 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
小学大队长竞选稿
2015/11/20 职场文书
JS数组去重详情
2021/11/07 Javascript
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS