修复: 修复文件下载时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
|
||||
});
|
||||
}
|
||||
// 发生错误时关闭存储连接
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user