修复: 修复文件下载时storage连接资源泄漏问题

问题:
- /api/files/download 路由在文件流下载时没有关闭storage连接
- 当下载大文件或多个并发下载时,会导致SFTP连接积累
- 可能导致连接池耗尽和内存泄漏

修复内容:
1. 添加stream.on('error')事件处理:流错误时关闭storage连接
2. 添加stream.on('close')事件处理:流传输完成时关闭storage连接
3. 增强catch块:在stream创建之前发生错误时关闭storage连接

影响范围:
- /api/files/download(用户文件下载)
- /api/share/:code/download-file(分享文件下载,已有处理逻辑)

测试建议:
- 测试正常文件下载
- 测试下载过程中断(用户取消下载)
- 测试下载不存在的文件(错误处理)
- 测试大文件下载和并发下载
This commit is contained in:
2025-11-11 15:06:20 +08:00
parent 2a58380b32
commit 60bc89ffea

View File

@@ -923,12 +923,32 @@ app.get('/api/files/download', authMiddleware, async (req, res) => {
message: '文件下载失败: ' + error.message
});
}
// 发生错误时关闭存储连接
if (storage) {
storage.end().catch(err => console.error('关闭存储连接失败:', err));
}
});
// 在传输完成后关闭存储连接
stream.on('close', () => {
console.log('[下载] 文件传输完成,关闭存储连接');
if (storage) {
storage.end().catch(err => console.error('关闭存储连接失败:', err));
}
});
stream.pipe(res);
} catch (error) {
console.error('下载文件失败:', error);
// 如果stream还未创建或发生错误关闭storage连接
if (storage) {
storage.end().catch(err => console.error('关闭存储连接失败:', err));
}
if (!res.headersSent) {
res.status(500).json({
success: false,