修复: 修复文件下载时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:
@@ -923,12 +923,32 @@ app.get('/api/files/download', authMiddleware, async (req, res) => {
|
|||||||
message: '文件下载失败: ' + error.message
|
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);
|
stream.pipe(res);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('下载文件失败:', error);
|
console.error('下载文件失败:', error);
|
||||||
|
|
||||||
|
// 如果stream还未创建或发生错误,关闭storage连接
|
||||||
|
if (storage) {
|
||||||
|
storage.end().catch(err => console.error('关闭存储连接失败:', err));
|
||||||
|
}
|
||||||
if (!res.headersSent) {
|
if (!res.headersSent) {
|
||||||
res.status(500).json({
|
res.status(500).json({
|
||||||
success: false,
|
success: false,
|
||||||
|
|||||||
Reference in New Issue
Block a user