Express.js 文件上传和下载的最佳实践

本篇文章将介绍 Express.js 是如何处理文件上传和下载的,并提供最佳实践和示例代码。

介绍

Express.js 是 Node.js 最流行的 Web 框架之一,提供了一系列工具和中间件来处理 HTTP 请求和响应。在 Web 应用程序中,文件上传和下载是很常见的功能,例如:用户上传一个头像或者下载一个 PDF 文件。

本文将介绍 Express.js 如何处理文件上传和下载,包括以下几个方面:

  1. 文件上传
  2. 文件上传限制
  3. 文件上传进度条
  4. 文件下载
  5. 文件下载限制

文件上传

首先来看如何处理文件上传。在 Express.js 中,文件上传需要使用中间件 multer。使用 multer 可以方便地处理文件的上传和存储。

首先,我们需要安装 multer

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

然后在 Express 应用程序中使用 multer 中间件:

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

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

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

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

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

在上面的示例中,我们定义了一个路由 /upload,使用了 multer 中间件来处理上传的文件。multer({ dest: 'uploads/' }) 表示上传的文件将保存在 uploads/ 目录下。upload.single('file') 中的 'file' 表示上传表单中的文件字段。如果没有指定这个字段,上传会失败。

现在我们可以使用 curl 来测试文件上传:

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

这样就上传了一个名称为 filename.txt 的文件。

文件上传限制

在实际应用中,我们需要对上传的文件设置一些限制。例如:上传文件的大小限制、文件类型限制等等。

multer 中,我们可以使用 limitsfileFilter 选项来设置文件上传限制。

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

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

在上面的示例中,我们设置了文件大小限制为 5MB,只允许上传图片类型的文件(jpg、jpeg、png、gif)。如果上传的文件类型不是这些类型的文件,会返回错误提示。

文件上传进度条

在上传大文件时,我们需要显示一个进度条来提示用户上传的进度。在 Express.js 中,我们可以使用 progress-stream 模块来获取上传进度。

首先安装 progress-stream

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

然后在文件上传函数中使用 progress-stream

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

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

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

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

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

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

在上面的示例中,我们创建了一个 progress-stream 对象 ps,将其传递给 multer 中间件。length 表示上传文件的长度,time 表示多久输出一次进度。我们使用 ps.on('progress', function(progress) {}) 来监听进度变化。

在最后的上传回调函数中,我们需要判断是否出现了错误,以及处理上传的文件。

文件下载

和文件上传类似,我们也可以在 Express.js 中处理文件下载。我们需要使用 Node.js 内置的 fs 模块来读取文件,并将读取的数据写入到响应流中。

下面是下载一个文本文件的代码示例:

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

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

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

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

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

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

在上面的示例中,我们定义了一个路由 /download,读取文件 example.txt 的内容,并将其设置为响应流的数据。通过设置 Content-Disposition 头来告诉浏览器下载这个文件。

文件下载限制

和文件上传类似,我们也需要对文件下载进行限制。例如:文件下载的大小限制、文件下载的权限等等。

在 Express.js 中,我们可以使用 fs 模块读取文件之前进行限制。

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

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

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

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

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

在上面的示例中,我们在读取文件之前判断文件大小和文件下载权限,如果超过限制或没有权限下载,返回相应的错误提示。

结论

在 Express.js 中,我们可以方便地处理文件上传和下载。使用 multer 中间件可以轻松地处理文件上传,使用 fs 模块可以轻松地处理文件下载。在实际应用中,我们需要对文件进行限制和权限判断来保证系统安全和可靠性。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/67120d4dad1e889fe20262a7


猜你喜欢

  • 使用 Enzyme 测试 React 高阶组件

    使用 Enzyme 测试 React 高阶组件 React 是一个流行的 JavaScript 库,用于构建用户界面。它已经成为开发人员的优选之一,因为它以可组合性和高可读性而闻名。

    5 天前
  • 解决 GraphQL 中无法执行查询的错误

    GraphQL 是一种用于 API 的查询语言,在前端开发中已经越来越流行。尽管 GraphQL 在编写数据查询请求时非常方便,但有时会出现一些错误,比如无法执行查询。

    5 天前
  • Redux 如何在 React 之外使用

    什么是 Redux? Redux 是一种状态管理库,为 JavaScript 应用程序提供可预测的状态容器。它通常与 React 一起使用,但它并不是为 React 设计的,可以在任何 JavaScr...

    5 天前
  • 报错解决:Node.js setTimeout 与 setInterval 函数被卡顿的解决方法

    在 Node.js 中,setTimeout 和 setInterval 是常用的定时器函数。但是,在某些情况下,它们可能会被卡顿,导致定时器无法正常执行。这篇文章将探讨 Node.js 中 setT...

    5 天前
  • 如何在 Chai.js 中测试一个对象是否相等

    如何在 Chai.js 中测试一个对象是否相等 在前端开发过程中,测试是不可或缺的环节。常常需要对一些数据进行比较,尤其是涉及到对象的比较。Chai.js 是一个常用的测试框架,它提供了方便的 API...

    5 天前
  • 使用 Custom Elements 创建模态框组件

    随着前端技术的不断发展,越来越多的开发者开始使用自定义元素(Custom Elements)来构建复杂的 web 应用程序。在这篇文章中,我们将介绍如何使用 Custom Elements 创建一个模...

    5 天前
  • 使用 Mongoose 进行分页查询的实现方法

    在前端开发中,我们经常需要从数据库中查询大量的数据,并将它们按照一定规则进行展示。当数据量较大时,为了避免一次性加载过多的数据造成页面卡顿,我们通常需要使用分页查询的方式来解决这个问题。

    5 天前
  • 如何通过 PM2 管理用 Node.js 编写的进程

    在前端开发中,我们经常使用 Node.js 来编写服务器端代码。当我们在服务器上运行 Node.js 应用程序时,需要确保它们始终在运行状态以保持业务连续性。为了解决这个问题,我们可以使用进程管理器,...

    5 天前
  • Web Components 实践 | 如何解决组件间通信的问题?

    Web Components 是一种用于创建可重复使用和独立的 UI 组件的技术。它由三个主要的技术组成:Custom Elements、Shadow DOM 和 HTML Templates。

    5 天前
  • 基于 Vue 和 Webpack 的 SPA 架构实现详解及常见 Bug 的解决方法

    单页面应用程序(SPA)已经成为当今 Web 开发领域中的一种热门架构。它具有快速和异步加载资源的优点以及流畅的用户体验。然而,SPA 也有一些常见的问题,如初始化速度、SEO 和浏览器兼容性等。

    5 天前
  • Kubernetes 中的 Ingress 详解

    随着云计算和容器化技术的不断发展,Kubernetes(简称 K8s)逐渐成为了云原生应用开发的主流技术之一。而在 K8s 中,Ingress 是一个十分重要的模块,它的作用是允许外部的 HTTP/H...

    5 天前
  • 详解 ES10 中的模块(Module)规范及使用方式

    Javascript 语言自身不支持模块化(Module)的概念,将多个脚本文件组织成一个模块,提高程序的可维护性和可重用性,是前端程序员一直在探讨的问题。事实上,在 ES6 之前,JavaScrip...

    5 天前
  • Vue.js:使用 v-bind 动态绑定组件属性的方法

    Vue.js 是一款流行的 JavaScript 前端库,它提供了许多有用的功能和工具,方便开发者快速构建现代化的 web 应用程序。Vue.js 的一个强大特性是 v-bind 指令,它允许开发者在...

    5 天前
  • 如何提高 PWA 应用的交互体验

    PWA 应用已经成为了现代 Web 应用程序的一种趋势,PWA 不仅仅是提供了 Web 应用程序的离线访问和更好的性能体验,同时还提供了与本地应用程序相同的用户体验。

    5 天前
  • Fastify 中的全局错误处理方式

    Fastify 是一个快速、低开销且灵活的 web 框架,它使用 Node.js 运行,并且专注于提高 HTTP 服务器性能,以及减少处理请求和响应的时间,并有助于使应用程序构建更好的 API。

    5 天前
  • Deno 中如何处理跨域问题?

    Deno 是一个以安全、稳定、高效为目标设计的现代化 JavaScript 和 TypeScript 运行时环境。在 Deno 中,如何处理跨域问题呢?本文将为您详细介绍。

    5 天前
  • 响应式设计中图片宽度错位问题的解决方法

    随着移动互联网的发展,越来越多的用户使用移动设备访问网站,响应式设计已经成为了现代网站开发的标配。然而,当我们在设计响应式网站的过程中,常常会遇到图片宽度错位的问题。

    5 天前
  • ES8 引入的 Object.getOwnPropertyDescriptors() 方法的错误猜测与实验证明

    背景 ES8 在 2017 年发布了新的标准,其中引入了 Object.getOwnPropertyDescriptors() 方法。该方法能够返回一个对象的所有属性描述符,包括对应属性的值、可枚举性...

    5 天前
  • 如何使用 Node.js 和 Express 创建 RESTful API?

    在今天的互联网应用程序中,RESTful API 已经成为了一种非常流行的架构模式。RESTful API 可以被用来支持不同的客户端设备和应用程序,例如 iOS、Android、Web、桌面应用程序...

    5 天前
  • Webpack 打包 React 时的策略优化

    随着前端技术不断发展,React 已经成为了现代化前端框架的代表。Webpack 是 React 应用中用于打包构建的强大工具。本文将探索如何在 Webpack 打包 React 应用时实现最佳性能,...

    5 天前

相关推荐

    暂无文章