fix: precheck local share download quota at download-url stage

This commit is contained in:
2026-02-17 19:08:47 +08:00
parent 3ab92d672d
commit 53e77ebf4e

View File

@@ -5892,6 +5892,44 @@ app.post('/api/share/:code/download-url', shareRateLimitMiddleware, async (req,
// 本地存储:继续走后端下载 // 本地存储:继续走后端下载
if (storageType !== 'oss') { if (storageType !== 'oss') {
if (!ownerTrafficState.isUnlimited) {
const { StorageInterface } = require('./storage');
const userForStorage = buildStorageUserContext(shareOwner, {
current_storage_type: storageType
});
const storageInterface = new StorageInterface(userForStorage);
let storage = null;
try {
storage = await storageInterface.connect();
const fileStats = await storage.stat(normalizedFilePath);
const fileSize = Number(fileStats?.size || 0);
if (!Number.isFinite(fileSize) || fileSize <= 0) {
return res.status(503).json({
success: false,
message: getBusyDownloadMessage()
});
}
if (fileSize > ownerTrafficState.remaining) {
return res.status(503).json({
success: false,
message: getBusyDownloadMessage()
});
}
} catch (statError) {
if (statError && (statError.code === 'ENOENT' || String(statError.message || '').includes('不存在'))) {
return res.status(404).json({
success: false,
message: '文件不存在'
});
}
throw statError;
} finally {
if (storage) {
await storage.end();
}
}
}
let downloadUrl = `${getSecureBaseUrl(req)}/api/share/${code}/download-file?path=${encodeURIComponent(normalizedFilePath)}`; let downloadUrl = `${getSecureBaseUrl(req)}/api/share/${code}/download-file?path=${encodeURIComponent(normalizedFilePath)}`;
if (share.share_password) { if (share.share_password) {