如何处理 RESTful API 中的文件上传及下载

阅读时长 5 分钟读完

随着互联网的发展,越来越多的应用需要支持文件上传和下载。在 RESTful API 中,文件上传和下载的实现方式与传统应用有所不同。本文将介绍如何处理 RESTful API 中的文件上传及下载,并提供示例代码。

文件上传

前端实现

在前端,文件上传通常使用 HTML 的 input 标签实现。我们需要在 form 标签中添加 enctype 属性,指定上传的数据类型为 multipart/form-data,并在表单中添加一个 input 标签,类型为 file

示例代码:

当用户选择文件后,可以使用 JavaScript 的 FormData 对象将文件上传到服务器。同时,我们可以指定请求的方法为 POST,并将文件对象传递给 FormData 对象。

示例代码:

-- -------------------- ---- -------
----- ---- - ------------------------------
----- --------- - --------------------------------------------

------------------------------- ----- -- -
  ----------------------

  ----- -------- - --- ----------
  ----------------------- -------------------

  -------------------- -
    ------- -------
    ----- --------
  ---------------- -- -
    ---------------------
  -------------- -- -
    --------------------
  --
--

后端实现

在服务器端,处理上传文件通常需要使用第三方库。在 Node.js 中,常用的库有 multerformidable。这里以 multer 为例。

首先,我们需要创建一个 multer 实例,并指定上传的文件存储路径。在路由处理函数中使用 multer() 方法创建一个中间件。

示例代码:

这里的 upload.single('file') 表示只允许上传单个文件,并且文件字段名为 file。最后,我们可以在路由处理函数中访问上传的文件对象。

文件下载

前端实现

在前端,可以使用 XMLHttpRequestfetch 方法来下载文件。以 fetch 方法为例,我们可以设置 responseType 属性为 blob,并在响应中使用 blob() 方法获取文件二进制数据。

示例代码:

-- -------------------- ---- -------
------------------------------- -
  ------- -----
---------------- -- -
  ------ ---------------
------------ -- -
  ----- ---- - ---------------------------
  --------- - -------------------------
  ------------- - ----------
  ------------
-------------- -- -
  --------------------
--

这里的 /api/download/file.pdf 表示下载文件的 API 接口,返回的是文件内容,而不是 JSON 数据。

后端实现

在服务器端,处理文件下载通常需要设置响应头。在 Node.js 中,可以使用 res.sendFile() 方法将文件发送给客户端,同时设置 Content-Disposition 响应头,指定文件名和下载方式。

示例代码:

这里的 response.sendFile() 方法指定需要下载的文件路径,并且文件路径一定要是绝对路径。最后,我们可以在路由处理函数中访问文件内容,并通过 res 对象将文件发送给客户端。

总结

以上是处理 RESTful API 中的文件上传及下载的方法,其中前端通过 FormData 对象上传文件,后端使用 multer 库处理文件上传;前端通过 fetch 方法下载文件,后端使用 res.sendFile() 方法发送文件内容。希望本文能够对您有所启发,并为您的开发工作带来帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6481a57548841e9894120e7c

纠错
反馈