diff --git a/app/(admin)/settings/admin-settings-client.tsx b/app/(admin)/settings/admin-settings-client.tsx
index 68730937f..d57856f34 100644
--- a/app/(admin)/settings/admin-settings-client.tsx
+++ b/app/(admin)/settings/admin-settings-client.tsx
@@ -293,6 +293,7 @@ type StorageFailoverConfig = {
type OssImageMigrationConfig = {
enabled: boolean;
+ preferAliyunForUploads: boolean;
sourceStorageConfigId: string;
targetStorageConfigId: string;
migrateAfterHours: number;
@@ -321,6 +322,7 @@ const defaultStorageFailoverConfig: StorageFailoverConfig = {
const defaultOssImageMigrationConfig: OssImageMigrationConfig = {
enabled: true,
+ preferAliyunForUploads: true,
sourceStorageConfigId: "",
targetStorageConfigId: "",
migrateAfterHours: 48,
@@ -789,6 +791,8 @@ export function AdminSettingsClient() {
},
ossImageMigrationConfig: {
enabled: (siteSettingsData as any).ossImageMigrationConfig?.enabled !== false,
+ preferAliyunForUploads:
+ (siteSettingsData as any).ossImageMigrationConfig?.preferAliyunForUploads !== false,
sourceStorageConfigId: String(
(siteSettingsData as any).ossImageMigrationConfig?.sourceStorageConfigId || ""
).trim(),
@@ -7794,6 +7798,30 @@ export function AdminSettingsClient() {
/>
+
+
+
+
+ 关闭后新上传图片直接走当前默认存储,不再优先进入阿里云 OSS。
+
+
+ 该开关只影响新图上传入口,不影响下方的转存时间、清理时间、单次批量任务设置。
+
+
+
+ setSiteSettings((prev) => ({
+ ...prev,
+ ossImageMigrationConfig: {
+ ...prev.ossImageMigrationConfig,
+ preferAliyunForUploads: checked,
+ },
+ }))
+ }
+ />
+
+
@@ -7809,7 +7837,9 @@ export function AdminSettingsClient() {
}))
}
>
-
+
@@ -7829,6 +7859,11 @@ export function AdminSettingsClient() {
))}
+ {!siteSettings.ossImageMigrationConfig.preferAliyunForUploads ? (
+
+ 已关闭默认走阿里云 OSS,当前源桶选择不会用于新上传图片。
+
+ ) : null}
diff --git a/app/api/site-settings/route.ts b/app/api/site-settings/route.ts
index 9827942e2..639e87c5a 100644
--- a/app/api/site-settings/route.ts
+++ b/app/api/site-settings/route.ts
@@ -659,6 +659,7 @@ const updateSchema = z.object({
ossImageMigrationConfig: z
.object({
enabled: z.boolean().optional(),
+ preferAliyunForUploads: z.boolean().optional(),
sourceStorageConfigId: z.string().max(128).optional(),
targetStorageConfigId: z.string().max(128).optional(),
migrateAfterHours: z.number().min(1).max(720).optional(),
diff --git a/lib/storage/migration-config.ts b/lib/storage/migration-config.ts
index 2aa5da807..caee3398b 100644
--- a/lib/storage/migration-config.ts
+++ b/lib/storage/migration-config.ts
@@ -2,6 +2,7 @@ export const OSS_MIGRATION_CONFIG_KEY = "oss_image_migration_config";
export type OssImageMigrationConfig = {
enabled: boolean;
+ preferAliyunForUploads: boolean;
sourceStorageConfigId: string;
targetStorageConfigId: string;
migrateAfterHours: number;
@@ -11,6 +12,7 @@ export type OssImageMigrationConfig = {
export const defaultOssImageMigrationConfig: OssImageMigrationConfig = {
enabled: true,
+ preferAliyunForUploads: true,
sourceStorageConfigId: "",
targetStorageConfigId: "",
migrateAfterHours: 48,
@@ -51,6 +53,7 @@ export function normalizeOssImageMigrationConfig(
return {
enabled: raw.enabled !== false,
+ preferAliyunForUploads: raw.preferAliyunForUploads !== false,
sourceStorageConfigId: String(raw.sourceStorageConfigId || "").trim(),
targetStorageConfigId: String(raw.targetStorageConfigId || "").trim(),
migrateAfterHours: normalizedMigrateAfterHours,
@@ -58,4 +61,3 @@ export function normalizeOssImageMigrationConfig(
batchSize: normalizedBatchSize,
};
}
-
diff --git a/lib/storage/service.ts b/lib/storage/service.ts
index 51cbd5cfe..fb1a58cfe 100644
--- a/lib/storage/service.ts
+++ b/lib/storage/service.ts
@@ -254,6 +254,10 @@ function normalizeStorageFailoverConfig(value: unknown): {
async function resolvePreferredUploadStorageConfig(
migrationConfig: OssImageMigrationConfig
): Promise {
+ if (!migrationConfig.enabled || !migrationConfig.preferAliyunForUploads) {
+ return await getDefaultStorageConfig();
+ }
+
const preferredAliyunConfig = await getPreferredAliyunStorageConfig({
preferredId: migrationConfig.sourceStorageConfigId || undefined,
});