首页 > 其他分享 >前端 JS 经典:阿里云文件上传思路

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

时间:2024-06-06 21:31:37浏览次数:21  
标签:文件 console log JS 阿里 const div 上传

前言:功能点概括: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" />
    <meta
      name="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 取消 

标签:文件,console,log,JS,阿里,const,div,上传
From: https://blog.csdn.net/weixin_64684095/article/details/139456152

相关文章

  • 微前端学习笔记(5):从import-html-entry发微DOM/JS/CSS隔离
    import-html-entry 是qiankun中一个举足轻重的依赖,用于获取子应用的HTML和JS,同时对HTML和JS进行了各自的处理,以便于子应用在父应用中加载。 import-html-entry主要是实现了以下几个能力拉取url对应的html并且对html进行了一系列的处理拉取上述html中所......
  • 记录工作中常用的 JS 数组相关操作
    工作中难免会遇到各种各样的数据结构,较为全面的了解数组操作,对于复杂数据结构的处理会非常有用且节省时间所以想在这里总结一下工作中常用的数组操作,都是一些非常基础的知识,大家看个乐就好~目录工作中常用的数组方法常见数组方法中的用法、以及坑slice()和splice()方法......
  • js中try中定义的数据catch无法访问
    如果你在try块中定义了一个变量,但在catch块中访问时得到undefined,这可能是因为以下几个原因:变量作用域问题:如果在try块中使用let或const声明了变量,这些变量只在try块内部可见(即具有块级作用域)。当控制权转移到catch块时,这些变量就不可见了,因此尝试访问它们会得到undefined。但根......
  • C# NewtonJson Self referencing loop detected for property 'Parent' with type
    privatevoidImage_MouseLeftButtonDown(objectsender,MouseButtonEventArgse){stringimgJson1=JsonConvert.SerializeObject(img1);System.IO.File.AppendAllText($"{DateTime.Now.ToString("yyyyMMddHHmmssffff")}_img.json",imgJso......
  • 阿里140逆向纯与补
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标网站aHR0cHM6Ly93d3cuanVtaW5nLmNvbS8=分析逆向流程今天我们看看ali的的n参数为140开头的站我......
  • C# 使用Newtonsoft.Json的JsonProperty设置返回的Json数据列名/C# 通过实体类序列化生
    原文链接:https://blog.csdn.net/weixin_44917045/article/details/103236167         https://blog.csdn.net/bazinga_y/article/details/134416680在写分页的时候,返回Json数据给前台的时候,数据不能出来,原因就是Json数据的列名是大写的,而页面需要的是小写的。......
  • vue+java实现大文件上传解决方案
    分片上传大文件Demo为了实现分片上传,包括断点续传和重试机制,我们可以使用Vue.js作为前端,SpringBoot作为后端。这个方案包括以下步骤:前端:使用Vue.js进行文件分片上传。管理分片上传的进度和状态,处理断点续传和重试。后端:使用SpringBoot处理分片上传的请求。存储上......
  • json.dumps 用法
    在Python中,json.dumps()函数是将Python对象转换为JSON格式的字符串的方法。下面是json.dumps()函数的基本用法:importjson#定义一个Python字典对象data={"name":"John","age":30,"city":"NewYork"}#将Python字典转换为JSO......
  • three.js高性能渲染室外场景
    大家好,本文在相关文章的基础上,使用three.js渲染了高性能的室外场景,在移动端也有较好的性能,并给出了代码,分析了关键点,感谢大家~关键词:three.js、Web3D、WebGL、室外场景、InstancedDraw、大场景、LOD、FrustumCull、优化、开源代码:Github相关文章:three.js实现数字孪生3D仓库......
  • 锐捷校园网自助服务系统 login_judge.jsf 任意文件读取漏洞复现(XVE-2024-2116)
    0x01产品简介锐捷校园网自助服务系统是锐捷网络推出的一款面向学校和校园网络管理的解决方案。该系统旨在提供便捷的网络自助服务,使学生、教职员工和网络管理员能够更好地管理和利用校园网络资源。0x02漏洞概述校园网自助服务系统/selfservice/selfservice/module/scgroup......