乐闻世界logo
搜索文章和话题

How to download a file with Node.js (without using third-party libraries)?

4 个月前提问
3 个月前修改
浏览次数41

1个答案

1

在 Node.js 中实现文件下载的一个基本方法是使用内置的 http 模块来创建一个服务器,然后使用 fs(文件系统)模块来读取文件内容并将其作为响应发送给客户端。以下是一个简单的例子,展示了如何通过 Node.js 设置一个能够提供文件下载的服务器:

javascript
const http = require('http'); const fs = require('fs'); const path = require('path'); // 创建 HTTP 服务器 const server = http.createServer((req, res) => { // 指定要下载的文件路径 const filePath = path.join(__dirname, 'example.txt'); // 读取文件信息 fs.stat(filePath, (err, stat) => { if (err) { console.error('Error getting file stats.'); res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end('Server error.'); return; } // 设置响应头部,以便浏览器知道这是一个需要下载的文件 res.writeHead(200, { 'Content-Type': 'application/octet-stream', // 或者设置为实际的文件类型 'Content-Disposition': `attachment; filename="${path.basename(filePath)}"`, 'Content-Length': stat.size, }); // 使用流来读取文件并写入响应中 const readStream = fs.createReadStream(filePath); readStream.pipe(res); // 处理流错误 readStream.on('error', (error) => { console.error('Error reading file stream.'); res.writeHead(500, { 'Content-Type': 'text/plain' }); res.end('Server error.'); }); }); }); const port = 3000; server.listen(port, () => { console.log(`Server is running on http://localhost:${port}`); });

以下是上述代码示例的逐步说明:

  1. 导入必要的模块:我们需要 http, fs, 和 path 模块来完成任务。
  2. 创建 HTTP 服务器:利用 http.createServer 方法,我们创建了一个简单的服务器来处理 HTTP 请求。
  3. 指定文件路径:使用 path.join 方法拼接出要下载的文件的绝对路径。
  4. 读取文件状态:通过 fs.stat 方法获取文件的状态,主要是为了得到文件大小,从而在响应头中设置 Content-Length
  5. 设置响应头:我们发送 200 OK 状态和一些指示这是文件下载的头部,如 Content-TypeContent-Disposition
  6. 使用流读取文件:通过创建一个读取流 fs.createReadStream 来读取文件内容,并使用 pipe 方法直接将其写入响应对象中。
  7. 错误处理:添加错误处理,以确保在读取文件流中出现错误时能够通知客户端。
  8. 监听端口:最后,服务器监听指定的端口,等待客户端连接和请求。

使用上述服务器代码,当客户端(例如浏览器)访问该服务器时,它将自动开始下载 example.txt 文件。这种方法适用于小到中等大小的文件,因为它通过流处理文件数据,并不会将整个文件内容加载到内存中。

对于大文件的下载,上述方法已经考虑了内存效率问题。但是,如果需要实现断点续传或其他高级功能,可能需要使用额外的库或实现更复杂的逻辑。

2024年6月29日 12:07 回复

你的答案