fix(storage): 修复腾讯云 COS 连接测试异常 (#362)

This commit is contained in:
MasterChiefCN
2026-08-31 15:06:34 +08:00
committed by GitHub
parent da65f5aae9
commit 190b848c9d
4 changed files with 68 additions and 28 deletions

View File

@@ -18,6 +18,8 @@ export type OSSConnectionTestInput = {
pathStyle?: boolean;
};
export type OSSConnectionTestDraft = Omit<Partial<OSSConnectionTestInput>, "provider"> & Pick<OSSConnectionTestInput, "provider">;
export type OSSConnectionTestResult = {
ok: boolean;
message?: string;
@@ -61,19 +63,7 @@ const S3_PRESET_HINTS: Record<S3Preset, { region: string; endpoint: string; help
},
};
const CONNECTION_FIELDS = new Set([
"provider",
"s3Preset",
"region",
"endpoint",
"cdnBaseUrl",
"bucket",
"accessKeyId",
"accessKeySecret",
"sessionToken",
"pathPrefix",
"pathStyle",
]);
const CONNECTION_FIELDS = new Set(["provider", "s3Preset", "region", "endpoint", "cdnBaseUrl", "bucket", "accessKeyId", "accessKeySecret", "sessionToken", "pathPrefix", "pathStyle"]);
export function getS3PresetHints(preset?: S3Preset) {
return S3_PRESET_HINTS[preset || "custom"];
@@ -82,3 +72,27 @@ export function getS3PresetHints(preset?: S3Preset) {
export function changesRequireOSSRetest(changedValues: Record<string, unknown>) {
return Object.keys(changedValues).some((key) => CONNECTION_FIELDS.has(key));
}
export function normalizeOSSConnectionTestInput(input: OSSConnectionTestDraft): OSSConnectionTestInput {
return {
provider: input.provider,
s3Preset: input.s3Preset || "custom",
region: trimConnectionValue(input.region),
endpoint: trimConnectionURL(input.endpoint),
cdnBaseUrl: trimConnectionURL(input.cdnBaseUrl),
bucket: trimConnectionValue(input.bucket),
accessKeyId: trimConnectionValue(input.accessKeyId),
accessKeySecret: trimConnectionValue(input.accessKeySecret),
sessionToken: trimConnectionValue(input.sessionToken),
pathPrefix: (trimConnectionValue(input.pathPrefix) || DEFAULT_OSS_PATH_PREFIX).replace(/^\/+|\/+$/g, ""),
pathStyle: input.pathStyle === true,
};
}
function trimConnectionValue(value?: string) {
return (value || "").trim();
}
function trimConnectionURL(value?: string) {
return trimConnectionValue(value).replace(/\/+$/, "");
}

View File

@@ -3,7 +3,7 @@ import { AlertTriangle, BadgeCheck, Check, Cloud, Database, Globe2, HardDrive, K
import { useCallback, useEffect, useRef, useState, type ReactNode } from "react";
import { useBlocker } from "react-router";
import { changesRequireOSSRetest, DEFAULT_OSS_PATH_PREFIX, getS3PresetHints, S3_PRESET_OPTIONS, type OSSConnectionTestResult, type S3Preset } from "@/lib/oss-settings";
import { changesRequireOSSRetest, DEFAULT_OSS_PATH_PREFIX, getS3PresetHints, normalizeOSSConnectionTestInput, S3_PRESET_OPTIONS, type OSSConnectionTestResult, type S3Preset } from "@/lib/oss-settings";
import { cn } from "@/lib/utils";
import { getAdminOSSSetting, testAdminOSSConnection, updateAdminOSSSetting, type AdminOSSSetting } from "@/services/api/auth";
import { AdminPageFrame } from "../components/admin-shell";
@@ -770,20 +770,20 @@ function trimTrailingSlash(value: string) {
return value.trim().replace(/\/+$/, "");
}
function connectionInput(values: OSSFormValues) {
return {
provider: values.mode === "local" ? ("aliyun" as const) : values.mode,
function connectionInput(values: Partial<OSSFormValues>) {
return normalizeOSSConnectionTestInput({
provider: !values.mode || values.mode === "local" ? ("aliyun" as const) : values.mode,
s3Preset: values.s3Preset,
region: values.region.trim(),
endpoint: trimTrailingSlash(values.endpoint),
cdnBaseUrl: trimTrailingSlash(values.cdnBaseUrl),
bucket: values.bucket.trim(),
accessKeyId: values.accessKeyId.trim(),
accessKeySecret: values.accessKeySecret.trim(),
sessionToken: values.sessionToken.trim(),
pathPrefix: (values.pathPrefix.trim() || DEFAULT_OSS_PATH_PREFIX).replace(/^\/+|\/+$/g, ""),
region: values.region,
endpoint: values.endpoint,
cdnBaseUrl: values.cdnBaseUrl,
bucket: values.bucket,
accessKeyId: values.accessKeyId,
accessKeySecret: values.accessKeySecret,
sessionToken: values.sessionToken,
pathPrefix: values.pathPrefix,
pathStyle: values.pathStyle === true,
};
});
}
function ConnectionTestStatus({ result, stale }: { result: OSSConnectionTestResult | null; stale: boolean }) {