基于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 相关文章推荐
两个select之间option的互相添加操作(jquery实现)
Nov 12 Javascript
jquery获取table中的某行全部td的内容方法
Mar 08 Javascript
jquery表格内容筛选实现思路及代码
Apr 16 Javascript
解读JavaScript中 For, While与递归的用法
May 07 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
Jun 20 Javascript
jQuery实现商品活动倒计时
Oct 16 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
Apr 30 Javascript
JavaScript 栈的详解及实例代码
Jan 22 Javascript
浅谈webpack 四个核心概念之Entry
Jun 12 Javascript
这应该是最详细的响应式系统讲解了
Jul 22 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
Jan 18 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
php实现利用phpexcel导出数据
2013/08/24 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
Hutia 的 JS 代码集
2006/10/24 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
利用JS实现数字增长
2016/07/28 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
python解决方案:WindowsError: [Error 2]
2016/08/28 Python
Python连接phoenix的方法示例
2017/09/29 Python
python re模块findall()函数实例解析
2018/01/19 Python
PyCharm代码提示忽略大小写设置方法
2018/10/28 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
Python 导入文件过程图解
2019/10/15 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python 如何在测试中使用 Mock
2021/03/01 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
英国最大的百货公司:Harrods
2016/08/18 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
2016年党支部公开承诺书
2016/03/25 职场文书
Go 在 MongoDB 中常用查询与修改的操作
2021/05/07 Golang
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
python中的装饰器该如何使用
2021/06/18 Python