Skip to content

Commit c35c057

Browse files
committed
per: 文件上传代理选择(全局设置)
1 parent 381baed commit c35c057

File tree

9 files changed

+332
-178
lines changed

9 files changed

+332
-178
lines changed

backend/schema.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ CREATE TABLE files (
113113
expires_at DATETIME, -- 过期时间
114114
max_views INTEGER, -- 最大查看次数
115115
views INTEGER DEFAULT 0, -- 当前查看次数
116-
use_proxy BOOLEAN DEFAULT 1, -- 是否使用代理访问
116+
use_proxy BOOLEAN DEFAULT 0, -- 是否使用代理访问
117117

118118
-- 元数据
119119
created_by TEXT, -- 创建者

backend/src/constants/settings.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,17 @@ export const DEFAULT_SETTINGS = {
8787
default_value: "0",
8888
},
8989

90+
default_use_proxy: {
91+
key: "default_use_proxy",
92+
type: SETTING_TYPES.BOOL,
93+
group_id: SETTING_GROUPS.GLOBAL,
94+
help: "新文件的默认代理设置。启用后新文件默认使用Worker代理,禁用后默认使用直链。",
95+
options: null,
96+
sort_order: 4,
97+
flag: SETTING_FLAGS.PUBLIC,
98+
default_value: "false",
99+
},
100+
90101
// 预览设置组
91102
preview_text_types: {
92103
key: "preview_text_types",

backend/src/services/fileService.js

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -359,29 +359,29 @@ export class FileService {
359359

360360
// 为每个文件添加字段(包括文件类型检测)
361361
const processedFiles = await Promise.all(
362-
files.map(async (file) => {
363-
// 添加文件类型信息
364-
const fileType = await GetFileType(file.filename, this.db);
365-
const fileTypeName = await getFileTypeName(file.filename, this.db);
366-
367-
const result = {
368-
...file,
369-
has_password: file.password ? true : false,
370-
type: fileType, // 整数类型常量 (0-6)
371-
typeName: fileTypeName, // 类型名称(用于调试)
372-
};
373-
374-
// 添加API密钥名称
375-
if (file.created_by && file.created_by.startsWith("apikey:")) {
376-
const keyId = file.created_by.substring(7);
377-
const keyName = keyNamesMap.get(keyId);
378-
if (keyName) {
379-
result.key_name = keyName;
380-
}
362+
files.map(async (file) => {
363+
// 添加文件类型信息
364+
const fileType = await GetFileType(file.filename, this.db);
365+
const fileTypeName = await getFileTypeName(file.filename, this.db);
366+
367+
const result = {
368+
...file,
369+
has_password: file.password ? true : false,
370+
type: fileType, // 整数类型常量 (0-6)
371+
typeName: fileTypeName, // 类型名称(用于调试)
372+
};
373+
374+
// 添加API密钥名称
375+
if (file.created_by && file.created_by.startsWith("apikey:")) {
376+
const keyId = file.created_by.substring(7);
377+
const keyName = keyNamesMap.get(keyId);
378+
if (keyName) {
379+
result.key_name = keyName;
381380
}
381+
}
382382

383-
return result;
384-
})
383+
return result;
384+
})
385385
);
386386

387387
return processedFiles;
@@ -533,4 +533,4 @@ export async function getUserFileList(db, apiKeyId, options = {}) {
533533
export async function getUserFileDetail(db, fileId, apiKeyId, encryptionSecret, request = null) {
534534
const fileService = new FileService(db);
535535
return await fileService.getUserFileDetail(fileId, apiKeyId, encryptionSecret, request);
536-
}
536+
}

backend/src/services/fileShareService.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,16 @@ export class FileShareService {
255255
// 处理最大查看次数
256256
const maxViews = typeof max_views === "number" && max_views > 0 ? max_views : null;
257257

258+
// 获取全局默认代理设置
259+
let defaultUseProxy = false; // 硬编码默认值作为后备
260+
try {
261+
const systemRepository = this.repositoryFactory.getSystemRepository();
262+
const defaultProxySetting = await systemRepository.getSettingMetadata("default_use_proxy");
263+
defaultUseProxy = defaultProxySetting?.value === "true";
264+
} catch (error) {
265+
console.warn("获取全局默认代理设置失败,使用硬编码默认值:", error);
266+
}
267+
258268
// 创建文件记录
259269
const fileRepository = this.repositoryFactory.getFileRepository();
260270
const fileData = {
@@ -272,7 +282,7 @@ export class FileShareService {
272282
password: passwordHash,
273283
expires_at: expiresAt,
274284
max_views: maxViews > 0 ? maxViews : null,
275-
use_proxy: use_proxy !== undefined ? use_proxy : true,
285+
use_proxy: use_proxy !== undefined ? use_proxy : defaultUseProxy,
276286
created_by: userType === "admin" ? userIdOrInfo : `apikey:${userIdOrInfo}`,
277287
created_at: new Date().toISOString(),
278288
updated_at: new Date().toISOString(),

backend/src/utils/database.js

Lines changed: 105 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ export async function initDatabase(db) {
155155
expires_at DATETIME,
156156
max_views INTEGER,
157157
views INTEGER DEFAULT 0,
158-
use_proxy BOOLEAN DEFAULT 1,
158+
use_proxy BOOLEAN DEFAULT 0,
159159
160160
-- 元数据
161161
created_by TEXT,
@@ -1164,6 +1164,109 @@ async function migrateDatabase(db, currentVersion, targetVersion) {
11641164
console.log("预览设置迁移失败,请手动检查system_settings表");
11651165
}
11661166
break;
1167+
1168+
case 14:
1169+
// 版本14:修改files表的use_proxy默认值为0(不使用代理)
1170+
try {
1171+
console.log("开始修改files表的use_proxy默认值...");
1172+
1173+
// 检查files表是否存在
1174+
const filesTableExists = await db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='${DbTables.FILES}'`).first();
1175+
1176+
if (filesTableExists) {
1177+
// SQLite不支持直接修改列的默认值,需要重建表
1178+
console.log("创建新的files表结构(use_proxy默认值为0)...");
1179+
1180+
// 1. 创建新表结构
1181+
await db
1182+
.prepare(
1183+
`
1184+
CREATE TABLE ${DbTables.FILES}_new (
1185+
id TEXT PRIMARY KEY,
1186+
slug TEXT UNIQUE NOT NULL,
1187+
filename TEXT NOT NULL,
1188+
1189+
-- 存储引用(支持多存储类型)
1190+
storage_config_id TEXT NOT NULL,
1191+
storage_type TEXT NOT NULL,
1192+
storage_path TEXT NOT NULL,
1193+
file_path TEXT,
1194+
1195+
-- 文件元数据
1196+
mimetype TEXT NOT NULL,
1197+
size INTEGER NOT NULL,
1198+
etag TEXT,
1199+
1200+
-- 分享控制(保持现有功能)
1201+
remark TEXT,
1202+
password TEXT,
1203+
expires_at DATETIME,
1204+
max_views INTEGER,
1205+
views INTEGER DEFAULT 0,
1206+
use_proxy BOOLEAN DEFAULT 0, -- 修改默认值为0
1207+
1208+
-- 元数据
1209+
created_by TEXT,
1210+
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
1211+
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
1212+
)
1213+
`
1214+
)
1215+
.run();
1216+
1217+
// 2. 复制数据到新表
1218+
console.log("复制数据到新表...");
1219+
await db
1220+
.prepare(
1221+
`
1222+
INSERT INTO ${DbTables.FILES}_new
1223+
SELECT * FROM ${DbTables.FILES}
1224+
`
1225+
)
1226+
.run();
1227+
1228+
// 3. 删除旧表
1229+
console.log("删除旧表...");
1230+
await db.prepare(`DROP TABLE ${DbTables.FILES}`).run();
1231+
1232+
// 4. 重命名新表
1233+
console.log("重命名新表...");
1234+
await db.prepare(`ALTER TABLE ${DbTables.FILES}_new RENAME TO ${DbTables.FILES}`).run();
1235+
1236+
// 5. 重建索引
1237+
console.log("重建索引...");
1238+
await db.prepare(`CREATE INDEX IF NOT EXISTS idx_files_slug ON ${DbTables.FILES}(slug)`).run();
1239+
await db.prepare(`CREATE INDEX IF NOT EXISTS idx_files_created_at ON ${DbTables.FILES}(created_at DESC)`).run();
1240+
await db.prepare(`CREATE INDEX IF NOT EXISTS idx_files_created_by ON ${DbTables.FILES}(created_by)`).run();
1241+
await db.prepare(`CREATE INDEX IF NOT EXISTS idx_files_storage_config ON ${DbTables.FILES}(storage_config_id)`).run();
1242+
1243+
console.log("files表use_proxy默认值修改完成");
1244+
} else {
1245+
console.log("files表不存在,跳过迁移");
1246+
}
1247+
1248+
// 添加全局默认代理设置
1249+
console.log("添加全局默认代理设置...");
1250+
const defaultUseProxySetting = await db.prepare(`SELECT key FROM ${DbTables.SYSTEM_SETTINGS} WHERE key = 'default_use_proxy'`).first();
1251+
1252+
if (!defaultUseProxySetting) {
1253+
await db
1254+
.prepare(
1255+
`
1256+
INSERT INTO ${DbTables.SYSTEM_SETTINGS} (key, value, description, type, group_id, options, sort_order, flags)
1257+
VALUES ('default_use_proxy', 'false', '文件管理的默认代理设置。启用后新上传文件默认使用Worker代理,禁用后默认使用直链。', 'bool', 1, NULL, 4, 0)
1258+
`
1259+
)
1260+
.run();
1261+
console.log("全局默认代理设置添加完成");
1262+
} else {
1263+
console.log("全局默认代理设置已存在,跳过添加");
1264+
}
1265+
} catch (error) {
1266+
console.error(`版本14迁移失败:`, error);
1267+
console.log("use_proxy默认值修改失败,请手动检查files表结构");
1268+
}
1269+
break;
11671270
}
11681271

11691272
// 记录迁移历史
@@ -1341,7 +1444,7 @@ export async function checkAndInitDatabase(db) {
13411444
}
13421445

13431446
// 如果要添加新表或修改现有表,请递增目标版本,修改后启动时自动更新数据库
1344-
const targetVersion = 13; // 目标schema版本,每次修改表结构时递增
1447+
const targetVersion = 14; // 目标schema版本,每次修改表结构时递增
13451448

13461449
if (currentVersion < targetVersion) {
13471450
console.log(`需要更新数据库结构,当前版本:${currentVersion},目标版本:${targetVersion}`);

0 commit comments

Comments
 (0)