返回

Node.js 服务器上的文件下载:ExpressJS 中的全面指南

javascript

## Node.js 服务器上的文件下载:ExpressJS 中的终极指南

## 概述

在使用 Node.js 服务器时,经常需要从服务器下载文件。本文将深入探讨如何在 ExpressJS 框架中实现文件下载,提供一个分步指南和一些高级技巧。

## 设置 Express 路由

要启用文件下载,我们需要首先设置一个 Express 路由。此路由将指定要下载的文件的路径,并指定处理请求的处理函数。

const express = require('express');
const fs = require('fs');

const app = express();

app.get('/download', (req, res) => {
  // 以下代码段将逐步完善
});

## 配置文件信息

下一步是配置文件信息,包括:

  • Content-Disposition:attachment :指示浏览器将文件作为附件下载。
  • Content-Type:application/octet-stream :指定文件为二进制流。
  • Content-Length:文件大小 :设置下载文件的长度。
app.get('/download', (req, res) => {
  const file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV');

  res.setHeader('Content-Disposition', 'attachment; filename="dramaticpenguin.MOV"');
  res.setHeader('Content-Type', 'application/octet-stream');
  res.setHeader('Content-Length', file.length);
});

## 发送文件

最后,发送文件内容本身。我们可以使用 res.send() 方法直接发送文件,也可以使用 res.sendFile() 方法将文件流式传输到客户端。

app.get('/download', (req, res) => {
  const file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV');

  res.setHeader('Content-Disposition', 'attachment; filename="dramaticpenguin.MOV"');
  res.setHeader('Content-Type', 'application/octet-stream');
  res.setHeader('Content-Length', file.length);

  res.send(file);
});

## 完整代码

将上述代码段放在一起,可以得到完整的 ExpressJS 路由:

const express = require('express');
const fs = require('fs');

const app = express();

app.get('/download', (req, res) => {
  const file = fs.readFileSync(__dirname + '/upload-folder/dramaticpenguin.MOV');

  res.setHeader('Content-Disposition', 'attachment; filename="dramaticpenguin.MOV"');
  res.setHeader('Content-Type', 'application/octet-stream');
  res.setHeader('Content-Length', file.length);

  res.send(file);
});

app.listen(3000);

## 高级技巧

### HTTP 头缓存

可以使用 HTTP 头来缓存下载的文件,以提高性能。

### 流式传输大文件

对于大文件,可以使用 res.sendFile() 方法进行流式传输,避免内存不足的问题。

### 限制文件下载

可以通过检查用户权限或文件大小来限制用户下载特定文件。

## 结论

遵循本指南,你可以轻松地在 ExpressJS 应用程序中实现文件下载功能。通过利用高级技巧,你可以进一步优化性能和安全。

## 常见问题解答

1. 如何获取文件的 MIME 类型?

可以使用 mime 模块获取文件的 MIME 类型。

const mime = require('mime');
const type = mime.getType('/path/to/file.ext');

2. 如何处理范围请求?

使用 res.range() 方法处理范围请求。

app.get('/download', (req, res) => {
  const range = req.headers.range;
  // 处理 range 请求
});

3. 如何保护文件免遭未经授权的访问?

使用中间件或自定义权限检查来保护文件免遭未经授权的访问。

4. 如何限制并发下载数量?

使用速率限制器或队列系统限制并发下载数量。

5. 如何记录下载活动?

使用日志记录工具记录下载活动,用于分析和故障排除。