当前位置:网站首页 > 技术博客 > 正文

前端上传文件流



  在日常工作中,文件上传是一个很常见的功能。在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能。一般来说,成熟的上传组件不仅会提供漂亮 UI 或好的交互体验,而且还会提供多种不同的上传方式,以满足不同的场景需求。

  一般在我们工作中,主要会涉及到

  对于单文件上传的场景来说,最常见的是图片上传的场景,所以我们就以图片上传为例,先来介绍单文件上传的基本流程。

1、前端代码

  在以下代码中,我们通过

  需要注意的是,虽然我们把 input 元素的

  要查看图片对应的二进制数据,我们可以借助一些现成的编辑器,比如 Windows 平台下的

  在以上代码中,我们先把读取的 File 对象封装成 FormData 对象,然后利用 Axios 实例的

服务端代码

  Koa 是一个简单易用的 Web 框架,它的特点是优雅、简洁、轻量、自由度高。所以我们选择它来搭建文件服务,并使用以下中间件来实现相应的功能:

  Koa 内核很简洁,扩展功能都是通过中间件来实现。比如示例中使用到的路由、CORS、静态资源处理等功能都是通过中间件实现。因此要想掌握 Koa 这个框架,核心是掌握它的中间件机制。如果你想深入了解的话,可以阅读

  在单文件上传的代码中,我们通过

  因为要支持上传多个文件,所以我们需要同步更新一下 函数。对应的处理逻辑就是遍历文件列表,然后使用 FormData 对象的 方法来添加多个文件,具体代码如下所示:

2、服务端代码

  在以下代码中,我们定义了一个新的路由 ——

  可能你还不知道,

  当我们选择了指定目录之后,

  点击上传按钮之后,我们就可以获取文件列表。列表中的文件对象上含有一个

  虽然通过 属性可以很容易地实现选择目录的功能,但在实际项目中我们还需要考虑它的兼容性。比如在 IE 11 以下的版本就不支持该属性,其它浏览器的兼容性如下图所示:

  了解完

前端代码

  为了让服务端能按照实际的目录结构来存放对应的文件:

(1)在添加表单项时我们需要把当前文件的路径提交到服务端。此外,

(2)为了确保

2、服务端代码

  目录上传与多文件上传,服务端代码的主要区别就是

  现在我们已经实现了目录上传的功能,那么能否把目录下的文件压缩成一个压缩包后再上传呢?答案是可以的,接下来我们来介绍如何实现压缩目录上传的功能。

  在

1、前端代码

  JSZip 实例上的

  在创建完

  在以上的

  以上就是压缩目录上传,前端部分的 JS 代码,服务端的代码可以参考前面单文件上传的相关代码。

  要实现拖拽上传的功能,我们需要先了解与拖拽相关的事件。比如

  基于上面的这些事件,我们就可以提高用户拖拽的体验。比如当用户拖拽的元素进入目标区域时,对目标区域进行高亮显示。当用户拖拽的元素离开目标区域时,移除高亮显示。很明显当

  那么如何获取拖拽对应的数据呢?这时我们需要使用 DataTransfer 对象,该对象用于保存拖动并放下过程中的数据。它可以保存一项或多项数据,这些数据项可以是一种或者多种数据类型。若拖动操作涉及拖动文件,则我们可以通过 DataTransfer 对象的

  介绍完拖拽上传相关的知识后,我们来看一下具体如何实现拖拽上传的功能。

  为了让大家能够更好地阅读拖拽上传的相关代码,我们把代码拆成 4 部分来讲解:

(1)阻止默认拖拽行为

(2)切换目标区域的高亮状态

(3)处理图片预览

(4)文件上传

  拖拽上传算是一个比较常见的场景,很多成熟的上传组件都支持该功能。其实除了拖拽上传外,还可以利用剪贴板实现复制上传的功能。

  在介绍如何实现剪贴板上传的功能前,我们需要了解一下 Clipboard API。

  

  在实际项目中,我们不需要手动创建

  在获取 对象之后,我们就可以利用该对象提供的 API 来访问剪贴板,比如:

  以上代码将 HTML 中含有

  利用 Clipboard API 我们可以很方便地操作剪贴板,但实际项目使用过程中也得考虑它的兼容性:

  要实现剪贴板上传的功能,可以分为以下 3 个步骤:

  了解完上述步骤,接下来我们来分析一下具体实现的代码。

1、前端代码

  在以下代码中,我们使用

  若当前浏览器不支持异步 Clipboard API,则我们会尝试通过

  前面已经提到,当从剪贴板解析到图片资源时,会让用户进行预览,该功能是基于 FileReader API 来实现的,对应的代码如下所示:

  当用户预览完成后,如果确认上传我们就会执行文件的上传操作。因为文件是从剪贴板中读取的,所以在上传前我们会根据文件的类型,自动为它生成一个文件名,具体是采用时间戳加文件后缀的形式:

  前面我们已经介绍了文件上传的多种不同场景,接下来我们来介绍一个 “特殊” 的场景 ——

  相信你可能已经了解大文件上传的解决方案,在上传大文件时,为了提高上传的效率,我们一般会使用 Blob.slice 方法对大文件按照指定的大小进行切割,然后通过多线程进行分块上传,等所有分块都成功上传后,再通知服务端进行分块合并。具体处理方案如下图所示:

  因为在

  前面我们都是介绍客户端文件上传的场景,其实也有服务端文件上传的场景。比如在服务端动态生成海报后,上传到另外一台服务器或云厂商的 OSS(Object Storage Service)。下面我们就以 Node.js 为例来介绍在服务端如何上传文件。

  服务器上传就是把文件从一台服务器上传到另外一台服务器。借助 Github 上 form-data 这个库提供的功能,我们可以很容易地实现服务器上传的功能。下面我们来简单介绍一下单文件和多文件上传的功能:

1、单文件上传

2、多文件上传

  观察以上代码可知,创建完

版权声明


相关文章:

  • 线程间怎么通信2024-12-20 22:01:02
  • xmlrpc-c2024-12-20 22:01:02
  • 创建用户useradd命令如果要指定用户uid2024-12-20 22:01:02
  • json.parse解析字符串报错2024-12-20 22:01:02
  • usb驱动程序在哪里2024-12-20 22:01:02
  • sqlserver char和varchar2024-12-20 22:01:02
  • jmap命令详解2024-12-20 22:01:02
  • img标签onerror2024-12-20 22:01:02
  • malloc函数2024-12-20 22:01:02
  • c++语言教程2024-12-20 22:01:02