文件上传 = 拖拽 + 多文件 + 文件夹

从前往后看都是努力,从后往前看都是命运

大家好,我是柒八九。一个专注于前端开发技术/RustAI应用知识分享Coder

前言

今天呢,和大家聊点耳熟能详的东西。文件上传

讲到这里,大家不要嗤之以鼻,认为这不是分分钟就用组件库实现的吗?确实,现在很多成熟的组件库都提供了文件上传的功能,但是呢,它们只提供部分的功能。比方说,

  1. 执行{多}文件上传
  2. 拖拽上传
  3. 针对文件夹内容上传
  4. {多}文件上传 + 文件夹上传

但是呢,这些框架只是提供了上面的部分功能,而不是将上面的功能全部一网打尽。

我们来看一下Antd的文件上传的功能。

Antd_Upload能实现上述功能,但是不能将上面所有功能糅合到一起。因为多文件上传文件夹上传它们实现原理是不同的。(Arco_Upload也是如此)。

所以,今天我们就来自己手搓一个文件上传。它所拥有的能力如下

  1. 支持{多}文件上传
  2. 拖拽上传
  3. 文件内容上传
  4. {多}文件上传 + 文件夹上传

也就是说,我们的文件上传可以上传你本地的任何文件。(除了系统文件,这个我们会提到)。

实现效果如下所示:

有人会说,人家都给你提供了组件,你为啥不用,你这不是重复造轮子吗?其实还真不是,之所以会出现这个问题,是因为现有的解决方案不支持我们的需求,我们才会大费周折的去找解决方案。

最后但同样重要的是:本文会提供一种解决方案,并且也会实现上述的所有功能,但是到后面文件上传到服务器的部分,这里就不做介绍了。也就是说,我们最后,通过操作能获取到Files信息,就认为这个组件封装成功了。

好了,天不早了,干点正事哇。

我们能所学到的知识点

  1. 项目初始化
  2. 拖拽功能
  3. 处理input
  4. 处理文件&回调
  5. 唤起弹窗

1. 项目初始化

因为,我们在做项目展示的时候,需要用到一些组件库和工具库,所以我们就抛弃vite/cra了,我们这里就直接使用我们的f_cli直接构建一个前端项目。

f_cli create upload_demo

如果你是一个老粉,你就知道,我们的f_cli是支持组件库选择的。在项目初始化时,我们可以选择组件库。

选择UI库

针对此次的demo我们就选择antd。然后,其他配置都按照你的心意来就完事了。

一顿操作之后,我们就有了一个功能完备的前端项目。

随后,我们可以执行yarn dev进行前端项目开发了。

也就说,我们下面的代码讲解和项目组织都是基于f_cli生成项目的基础上。


2. 拖拽功能

其实,针对拖拽功能的处理,我们有很多解决方案。

  1. 利用原生特性- 在DOM原生上新增draggable属性,然后监听dragstart/dragend等。可行吗,必须可行。但是,你需要处理和监听的事情很多。

    • 如果对这块还有些陌生,可以参考MDN_drag对这块的解释
  2. 利用库,有很多业界比较出名的拖拽库能处理我们的问题,使用库的好处就是我们通过简单的API能够获取我们想要的数据和要实现的功能操作。(所以,我们就是用第三方库实现拖拽功能)下面就列举几个比较常见的拖拽库。


通过npm_trend得知,react-dropzone独占鳌头。所以,我们就选用react-dropzone作为我们的拖拽解决方案。

拖拽组件

既然,材料和食谱都已经确定,那我们就需要烹饪我们的膳食了。

现在,我们把我们的上传场景再做一次限定,我们可以将我们整个页面作为我们的拖拽区域,这样我们就不必拘泥于特定组件了。(当然,这个区域是可以变更的)。

那么,我们为这个组件起一个霸气侧漏的名字 – FullScreenDropZone。看这名字多气派,FullScreen,它支持全屏范围内拖拽。也就是说,不管你把文件拖拽到页面的哪个位置,都可以触发文件上传功能。

<
  • 23
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值