前端 JS 经典:阿里云文件上传思路

前言:功能点概括:1、多选文件 2、选择文件夹 3、拖拽 4、选择后形成一个列表,列表里有一些信息 5、有进度条 6、控制并发数 7、可取消 8、展示统计信息

1. 交互实现

交互的目标是要拿到 file 对象。只要拿到 file 对象,就能通过网络上传。

1.1 如何选择多文件

给 input 添加 multiple 属性

<input type="file" multiple />

1.2 如何选择文件夹

给 input 添加 webkitdirectory、mozddirectory、odirectory 属性 

<input type="file" webkitdirectory mozddirectory odirectory />

 1.3 如何拖拽文件及文件夹

使用拖拽 API 触发事件 

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><metaname="viewport"content="initial-scale=1.0, user-scalable=no, width=device-width"/><title>document</title><style>.container {width: 100%;height: 200px;border: 1px solid;}</style></head><body><!-- 通过 $0.files 拿到所有文件File --><input type="file" multiple /><div class="container"></div><script>const div = document.querySelector(".container");// 都需要阻止默认行为,因为div是不允许任何东西拖拽到它上面的// 当进入时触发div.ondragenter = (e) => {console.log(1);e.preventDefault();};// 当有东西在盒子上时不断的触发div.ondragover = (e) => {console.log(2);e.preventDefault();};// 当有东西放在盒子上时触发div.ondrop = (e) => {e.preventDefault();const items = e.dataTransfer.items;for (const item of items) {const entry = item.webkitGetAsEntry();console.log(1, entry);if (entry.isFile) {// 处理文件:拿到File文件entry.file((file) => {console.log(2, file);});} else {const reader = entry.createReader();reader.readEntries((entries) => {console.log(entries);});}}};</script></body>
</html>

 2. 网络

网络部分用 XHR(axios) / fetch。

2.1 如何实现多文件上传 

有两种方案,一种是所有文件合并到一次请求里。另一种单文件上传,需要和后端协商。我们一般采取第二种,这样有文件上传失败,也不会影响其他文件的上传。方便做进度跟踪,大文件切片,控制并发上传数。

2.2 如何实现进度追踪 

上传进度跟踪 fetch 是实现不了的。只能实现下载的进度跟踪。我们可以通过 xhr.upload.onprogress 来控制上传进度跟踪。 

2.3 如何实现取消上传

XHR 通过 xhr.abort() 直接取消。fetch 是通过控制器 AbortController 取消 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22492.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大前端nestjs入门教程系列(五):nestjs整合jwt该怎么做

写在前面 相信大家对于jwt应该不陌生了,做过前后端分离的童鞋应该对jwt不陌生,但是jwt是用来干什么的呢?jwt是json web token的缩写,它是一个开放标准(RFC 7519),定义了一种紧凑且独立的方式,可以在各方通过JSON 对象安全地传输信息。此信息可以通过数字签名进行验证和…

ABB喷涂机器人IRB52维修指导分析

ABB喷涂机器人是一种非常重要的涂装设备&#xff0c;但是它的维护保养工作也必不可少。如果不定期维修保养&#xff0c;可能会导致ABB喷涂机械手故障&#xff0c;影响生产效率和产品质量。 首先&#xff0c;定期检查ABB涂装机器人IRB52喷嘴和喷枪是否正常&#xff0c;这是维修…

计算机视觉(CV)的教程、相关项目

计算机视觉(CV)是一个广泛而深入的领域,其教程和项目众多。以下是针对计算机视觉(CV)的教程和相关项目的一个清晰概述: 教程 入门教程: OpenCV入门:OpenCV是一个开源的计算机视觉库,提供了大量用于图像和视频处理的函数。可以通过OpenCV的官方文档或在线教程来学习其…

【Mac】Downie 4 for Mac(视频download工具)兼容14系统软件介绍及安装教程

前言 Downie 每周都会更新一个版本适配视频网站&#xff0c;如果遇到视频download不了的情况&#xff0c;请搜索最新版本https://mac.shuiche.cc/search/downie。 注意&#xff1a;Downie Mac特别版不能升级&#xff0c;在设置中找到更新一列&#xff0c;把自动更新和自动downl…

azure cli的安装和使用

1 概述 azure cli是管理azure云资源的命令行工具。 官网为&#xff1a; https://learn.microsoft.com/zh-cn/cli/azure/2 安装 2.1 容器安装 docker run -it mcr.microsoft.com/azure-cli3 登录 9d039d31f8e5:/# az login To sign in, use a web browser to open the page…

kafka-集群-生产消费测试

文章目录 1、集群生产消费测试1.1、消费者消费消息1.2、生产者生产消息 1、集群生产消费测试 1.1、消费者消费消息 [rootlocalhost ~]# kafka-console-consumer.sh --bootstrap-server 192.168.74.148:9095,192.168.74.148:9096,192.168.74.148:9097 --topic my_topic11.2、生…

Renesas MCU之定时器计数功能应用

目录 概述 1 功能介绍 1.1 时钟相关配置 1.2 应用接口 2 FSP配置Project参数 2.1 软件版本信息 2.2 配置参数 2.3 项目生成 3 定时器功能代码实现 3.1 定时器初始化函数 3.2 定时器回调函数 4 功能测试 5 参考文档 概述 本文主要介绍Renesas MCU的定时器功能的基…

使用Python在Word中创建和提取表格

目录 安装Python Word库 使用Python在Word中创建预定义行和列的表格 使用Python在Word中动态创建表格 使用Python在Word中提取表格数据 Word 文档中的表格是一种强大且灵活的数据组织和展示工具&#xff0c;它能将信息以行和列的形式有序地排列&#xff0c;使文档内容更加清…

全新STC12C5A60S2单片机+LCD19264大屏万年历农历生肖节气节日显示+闹钟+温湿度+台灯

资料下载地址&#xff1a;全新STC12C5A60S2单片机LCD19264大屏万年历农历生肖节气节日显示闹钟温湿度台灯 这是旧版 退役拆解了 新版 与电路图所示 共设置4个按键 短按开关台灯 加减键调光 长按进入菜单 1.台灯 加入PCA PWM 调光 STC12C5A60S2的PCA PWM非常好用 设置简单无极…

kubernetes负载均衡---MetalLB

https://github.com/metallb/metallb 参考 &#xff1a; https://mp.weixin.qq.com/s/MBOWfcTjFMmgJFWw-FIk0Q 自建的Kubernetes集群&#xff0c;默认情况下是不支持负载均衡的。当需要提供服务的外部访问时&#xff0c;可使用 Ingress、NodePort等方式。他们都存在一些问题 …

如何把几个pdf文件合成在一个pdf文件

PDF合并&#xff0c;作为一种常见的文件处理方式&#xff0c;无论是在学术研究、工作汇报还是日常生活中&#xff0c;都有着广泛的应用。本文将详细介绍PDF合并的多种方法&#xff0c;帮助读者轻松掌握这一技能。 打开 “轻云处理pdf官网” 的网站&#xff0c;然后上传pdf。 pd…

基于线性回归根据饮食习惯和身体状况估计肥胖水平

目录 1. 作者介绍2&#xff0e;饮食习惯与身体状况数据集介绍3&#xff0e;实验步骤3.1 数据分析3.2 可视化处理数据3.3 导入线性回归模型进行训练3.4 预测结果3.5 完整代码3.5.1 数据分析3.5.2 模型评估 参考文献 1. 作者介绍 刘欢&#xff0c;女&#xff0c;西安工程大学电子…

哈希表(Hash table)

哈希表(Hash table),也称为散列表,是一种根据关键码值(Key value)直接进行访问的数据结构。它通过散列函数(Hash function)将关键码值映射到表中的一个位置,以此来访问记录,从而加快查找的速度。以下是关于哈希表的详细解释: 基本概念 散列函数:将关键码值映射到表…

10 -每台机器的进程平均运行时间(高频 SQL 50 题基础版)

10 - 每台机器的进程平均运行时间 -- sum(if(activity_type end,timestamp ,-timestamp )) -- 如果activity_type为“end”,值为timestamp&#xff0c;为“start” 为-timestamp&#xff0c;所有数相加end-start -- count(distinct process_id),获取同一机器有几个进行id -- r…

python的sql解析库-sqlparse

内容目录 一、基本方法:1.parse(sql)2.format(sql)3.split()4.parsestream() 二、Token三、其他类型四、案例: 提取所有查询的字段和表名 sqlparse 是一个 Python 库&#xff0c;是一个用于 Python 的非验证 SQL 解析器, 用于解析 SQL 语句并提供一个简单的 API 来访问解析后的…

Vue中如何获取dom元素?

在Vue中&#xff0c;通常我们不直接操作DOM元素&#xff0c;因为Vue是一个声明式渲染的框架&#xff0c;它鼓励我们使用数据驱动视图的方式来更新UI。然而&#xff0c;在某些情况下&#xff0c;你可能需要直接访问DOM元素。在这种情况下&#xff0c;你可以使用Vue的ref属性和$r…

k8s Pods漂移时间配置

默认为300秒 apiVersion: apps/v1 kind: Deployment metadata:name: my-test spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-containerimage: nginx:latestports:- containerPort: 80tolerations:- key: &…

C++语言学习(七)—— 继承、派生与多态(一)

目录 一、派生类的概念 1.1 定义派生类的语法格式 1.1.1 定义单继承派生类 1.1.2 定义多继承派生类 1.2 继承方式 二、公有继承 三、派生类的构造和析构 四、保护成员的引入 五、改造基类的成员函数 六、派生类与基类同名成员的访问方式 七、私有继承和保护继承 7.…

bug记录——报了一堆xtr1common和yvals_core.h的错误

现象 今天使用VisualStdio2022时&#xff0c;突然出现了这样严重的报错&#xff0c;看得我一头雾水&#xff0c;而且无法启动VisualStdio2022的调试。 原因 发现NULL没法直接使用时&#xff0c;跟着提示添加了如下的头文件。 #include<cstddef>&#xff0c;是C标准库的头…

代码随想录算法训练营Day61 | 总结和展望 | Python | 个人记录向

总结 感觉训练营说短不短&#xff0c;说长不长&#xff0c;没想到一下子就度过了60天的刷题之旅。训练营之前自己模糊地刷过代码随想录&#xff0c;主要是二叉树前面的章节二叉树的前一部分后面章节的前几题&#xff0c;能稍微应对面试。但是&#xff0c;我亟需对coding进行系…