在 Node.js 中实现文件下载的一个基本方法是使用内置的 http
模块来创建一个服务器,然后使用 fs
(文件系统)模块来读取文件内容并将其作为响应发送给客户端。以下是一个简单的例子,展示了如何通过 Node.js 设置一个能够提供文件下载的服务器:
javascriptconst 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}`); });
以下是上述代码示例的逐步说明:
- 导入必要的模块:我们需要
http
,fs
, 和path
模块来完成任务。 - 创建 HTTP 服务器:利用
http.createServer
方法,我们创建了一个简单的服务器来处理 HTTP 请求。 - 指定文件路径:使用
path.join
方法拼接出要下载的文件的绝对路径。 - 读取文件状态:通过
fs.stat
方法获取文件的状态,主要是为了得到文件大小,从而在响应头中设置Content-Length
。 - 设置响应头:我们发送
200 OK
状态和一些指示这是文件下载的头部,如Content-Type
和Content-Disposition
。 - 使用流读取文件:通过创建一个读取流
fs.createReadStream
来读取文件内容,并使用pipe
方法直接将其写入响应对象中。 - 错误处理:添加错误处理,以确保在读取文件流中出现错误时能够通知客户端。
- 监听端口:最后,服务器监听指定的端口,等待客户端连接和请求。
使用上述服务器代码,当客户端(例如浏览器)访问该服务器时,它将自动开始下载 example.txt
文件。这种方法适用于小到中等大小的文件,因为它通过流处理文件数据,并不会将整个文件内容加载到内存中。
对于大文件的下载,上述方法已经考虑了内存效率问题。但是,如果需要实现断点续传或其他高级功能,可能需要使用额外的库或实现更复杂的逻辑。
2024年6月29日 12:07 回复