HTML5 拖拽批量上传文件的示例代码


Posted in HTML / CSS onMarch 28, 2018

拖拽批量上传文件夹

该组件基于 Vue.js 实现,UI 框架是 elementUI,完整的 demo 地址在https://github.com/Msxiaoma/upload-folder. 拖拽上传文件夹(仅仅chrome支持)

一、组件描述

  1. 同时拖拽多个文件夹
  2. 删除指定文件夹
  3. 显示当前文件夹的上传进度条
  4. 超过5M的文件夹分片上传

效果如下:

HTML5 拖拽批量上传文件的示例代码 

二、遇到的问题

  1. 拖拽读取每个文件夹下面的文件路径
  2. 如何显示当前上传的文件夹的进度条
  3. 上传文件时跨域携带 cookie
  4. 文件夹分片

三、解决过程

1. 拖拽读取每个文件夹下面的文件路径

在进行拖放操作时, DataTransfer 对象用来保存,通过拖放动作,拖动到浏览器的数据。它可以保存一项或多项数据、一种或者多种数据类型

// 拖拽文件夹
dropFolders (e) {
  e.stopPropagation()
  e.preventDefault()
  var items = e.dataTransfer.items
  for (var i = 0; i < items.length; i++) {
    var item = items[i].webkitGetAsEntry()
    if (item) {
      this.checkFolders(item)
    }
  }
}

// 判断是否为文件夹
checkFolders (item) {
  if (item.isDirectory) {
    this.traverseFileTree(item)
  } else {
    this.$alert('只支持上传文件夹', '提示', {
      confirmButtonText: '确定'
    })
  }
}

traverseFileTree (item, path, parentDir) {
  path = path || ''
  if (item.isFile) {
    item.file((file) => {
        let obj = {
          file: file,
          path: path + file.name,
          attr: item.attr
        }
        this.filesList.push(obj)
    })
  } else if (item.isDirectory) {
    var dirReader = item.createReader()
    dirReader.readEntries((entries) => {
      for (let i = 0; i < entries.length; i++) {
        entries[i].attr = item.attr
        this.traverseFileTree(entries[i], path + item.name + '/', temp)
      }
    }, function (e) {
      console.log(e)
    })
  }
}

2. 上传文件夹的进度条

没有分片的文件:根据文件夹中的文件总数,算出每个文件占文件夹的百分比,当一个文件上传成功时,修改文件夹 process;

分片的文件:算出每个文件占文件的百分比后,算出每块文件占文件的百分比,每块文件上传成功后,修改文件夹的 process.

3. 跨域携带 cookie

当服务器设置响应头

    Access-Control-Allow-Origin:必须指定明确的、与请求网页一致的域名,不能为 *。   Access-Control-Allow-Credentials: true

设置请求头:

    withCredentials:true

补充:

substring 和 substr 的区别

substr(start [, length ]) 返回一个从指定位置开始的指定长度的子字符串。

start:必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。
length:可选项。在返回的子字符串中应包括的字符个数。

substring 返回位于 String 对象中指定位置的子字符串,返回一个包含从 start 到最后(不包含 end )的子字符串的字符串

start:指明子字符串的起始位置,该索引从 0 开始起算。
end:指明子字符串的结束位置,该索引从 0 开始起算。

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

HTML / CSS 相关文章推荐
css3 自定义字体font-face使用介绍
May 14 HTML / CSS
CSS3实现大小不一的粒子旋转加载动画
Apr 21 HTML / CSS
CSS3制作缩略图的详细过程
Jul 08 HTML / CSS
canvas学习笔记之2d画布基础的实现
Feb 21 HTML / CSS
Canvas 文本转粒子效果的实现代码
Feb 14 HTML / CSS
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
Jan 06 HTML / CSS
会走动的图形html5时钟示例
Apr 27 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
Aug 18 HTML / CSS
HTML5 Blob对象的具体使用
May 22 HTML / CSS
HTML5图片层叠的实现示例
Jul 07 HTML / CSS
详解如何在登录过期后跳出Ifram框架
Sep 10 HTML / CSS
利用html5 canvas动态画饼状图的示例代码
Apr 02 #HTML / CSS
简单聊聊H5的pushState与replaceState的用法
Apr 03 #HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
Apr 18 #HTML / CSS
Html5 localStorage入门教程
Apr 26 #HTML / CSS
在HTML5 canvas里用卷积核进行图像处理的方法
May 02 #HTML / CSS
HTML5新增的标签和属性归纳总结
May 02 #HTML / CSS
HTML5 video视频字幕的使用和制作方法
May 03 #HTML / CSS
You might like
PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
比较完整的微信开发php代码
2016/08/02 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
Node.js重新刷新session过期时间的方法
2016/02/04 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
vue视频播放插件vue-video-player的具体使用方法
2019/11/08 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
Python简单日志处理类分享
2015/02/14 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
使用python实现生成用户信息
2017/03/20 Python
Python通过future处理并发问题
2017/10/17 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
2016年师德先进个人事迹材料
2016/02/29 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
python 进阶学习之python装饰器小结
2021/09/04 Python