From b8dd0fcd9db6b93e042085233341e122ac123bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=7B=E5=B9=B3=E6=B2=A2=20=E5=94=AF=7D?= <1370655052@qq.com> Date: Mon, 21 Jul 2025 16:08:58 +0800 Subject: [PATCH] feat(storage): add Kingsoft KS3 storage policy (#285) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat:添加金山KS3存储策略 * fix:pr question * fix:question --- public/locales/en-US/dashboard.json | 5 +- public/locales/ja-JP/dashboard.json | 5 +- public/locales/zh-CN/dashboard.json | 5 +- public/locales/zh-TW/dashboard.json | 5 +- public/static/img/ks3.png | Bin 0 -> 19612 bytes src/api/explorer.ts | 1 + .../FormSections/BasicInfoSection.tsx | 24 ++- .../FormSections/MediaMetadataSection.tsx | 2 +- .../StoragePolicy/StoragePolicySetting.tsx | 17 ++ .../StoragePolicy/Wizards/KS3/KS3Wizard.tsx | 187 ++++++++++++++++++ src/component/Uploader/core/index.ts | 3 + src/component/Uploader/core/uploader/base.ts | 1 + src/component/Uploader/core/uploader/ks3.ts | 28 +++ 13 files changed, 272 insertions(+), 11 deletions(-) create mode 100644 public/static/img/ks3.png create mode 100644 src/component/Admin/StoragePolicy/Wizards/KS3/KS3Wizard.tsx create mode 100644 src/component/Uploader/core/uploader/ks3.ts diff --git a/public/locales/en-US/dashboard.json b/public/locales/en-US/dashboard.json index a055423..669f464 100644 --- a/public/locales/en-US/dashboard.json +++ b/public/locales/en-US/dashboard.json @@ -847,6 +847,7 @@ "cos": "Tencent Cloud COS", "onedrive": "OneDrive", "s3": "S3 Compatible", + "ks3": "Kingsoft Cloud S3", "obs": "Huawei Cloud OBS", "load_balance": "Load Balance", "childPolicy": "Child Storage Policy", @@ -1011,7 +1012,9 @@ "driverRootDes": "Choose where to save files in your OneDrive account. Changing this option will make existing files in the storage policy inaccessible.", "saveToDefaultOneDrive": "Save files to default OneDrive driver", "saveToSharePoint": "Save files to SharePoint", - "sharePointUrlDes": "Enter the SharePoint site URL. After losing focus, the system will automatically convert it to the correct driver identifier." + "sharePointUrlDes": "Enter the SharePoint site URL. After losing focus, the system will automatically convert it to the correct driver identifier.", + "ks3selectRegionDes": "Enter the region code of the storage bucket, e.g. <0>BEIJING .", + "ks3EndpointPathStyle": "Select the format of the KS3 Endpoint address." }, "node": { "slave": "slave", diff --git a/public/locales/ja-JP/dashboard.json b/public/locales/ja-JP/dashboard.json index 118fa70..a4992a4 100644 --- a/public/locales/ja-JP/dashboard.json +++ b/public/locales/ja-JP/dashboard.json @@ -848,6 +848,7 @@ "cos": "Tencent COS", "onedrive": "OneDrive", "s3": "S3互換", + "ks3": "金山雲 KS3", "obs": "Huawei Cloud OBS", "load_balance": "負荷分散", "childPolicy": "子ストレージポリシー", @@ -1000,7 +1001,9 @@ "driverRootDes": "OneDriveアカウント内でファイルを保存する場所を選択してください。このオプションを変更すると、ストレージポリシーに既に存在するファイルにアクセスできなくなる可能性があります。", "saveToDefaultOneDrive": "ファイルをデフォルトのOneDriveドライブに保存", "saveToSharePoint": "SharePointにファイルを保存", - "sharePointUrlDes": "SharePointサイトのURLを入力してください。フォーカスが外れると、システムが自動的に正しいドライブ識別子に変換します。" + "sharePointUrlDes": "SharePointサイトのURLを入力してください。フォーカスが外れると、システムが自動的に正しいドライブ識別子に変換します。", + "ks3selectRegionDes": "バケットが存在するリージョンコードを入力してください(例:<0>BEIJING)。", + "ks3EndpointPathStyle": "パス形式エンドポイントの強制使用を選択してください。" }, "node": { "slave": "スレーブ", diff --git a/public/locales/zh-CN/dashboard.json b/public/locales/zh-CN/dashboard.json index 4e3499f..0748b07 100644 --- a/public/locales/zh-CN/dashboard.json +++ b/public/locales/zh-CN/dashboard.json @@ -847,6 +847,7 @@ "cos": "腾讯云 COS", "onedrive": "OneDrive", "s3": "S3 兼容", + "ks3": "金山云 KS3", "obs": "华为云 OBS", "load_balance": "负载均衡", "childPolicy": "子存储策略", @@ -999,7 +1000,9 @@ "driverRootDes": "选择在 OneDrive 账户中保存文件的位置。更改此选项会导致存储策略中已有文件无法访问。", "saveToDefaultOneDrive": "保存文件到默认 OneDrive 驱动器", "saveToSharePoint": "保存文件到 SharePoint", - "sharePointUrlDes": "输入 SharePoint 站点 URL。失去焦点后,系统将自动转换为正确的驱动器标识。" + "sharePointUrlDes": "输入 SharePoint 站点 URL。失去焦点后,系统将自动转换为正确的驱动器标识。", + "ks3selectRegionDes": "输入存储桶所在的区域代码,如 <0>BEIJING。", + "ks3EndpointPathStyle": "选择是否强制使用路径格式 Endpoint。" }, "node": { "slave": "从机", diff --git a/public/locales/zh-TW/dashboard.json b/public/locales/zh-TW/dashboard.json index 3c9bad2..27b3a80 100644 --- a/public/locales/zh-TW/dashboard.json +++ b/public/locales/zh-TW/dashboard.json @@ -844,6 +844,7 @@ "cos": "騰訊雲 COS", "onedrive": "OneDrive", "s3": "S3 相容", + "ks3": "金山雲 KS3", "obs": "華為雲 OBS", "load_balance": "負載均衡", "childPolicy": "子儲存策略", @@ -996,7 +997,9 @@ "driverRootDes": "選擇在 OneDrive 賬戶中儲存檔案的位置。更改此選項會導致儲存策略中已有檔案無法訪問。", "saveToDefaultOneDrive": "儲存檔案到預設 OneDrive 驅動器", "saveToSharePoint": "儲存檔案到 SharePoint", - "sharePointUrlDes": "輸入 SharePoint 站點 URL。失去焦點後,系統將自動轉換為正確的驅動器標識。" + "sharePointUrlDes": "輸入 SharePoint 站點 URL。失去焦點後,系統將自動轉換為正確的驅動器標識。", + "ks3selectRegionDes": "輸入儲存桶所在的區域程式碼,如 <0>BEIJING。", + "ks3EndpointPathStyle": "選擇是否強制使用路徑格式 Endpoint。" }, "node": { "slave": "從機", diff --git a/public/static/img/ks3.png b/public/static/img/ks3.png new file mode 100644 index 0000000000000000000000000000000000000000..079d597efaffba694623de74ef34da212c48a3bc GIT binary patch literal 19612 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 { values.type === PolicyType.obs || values.type === PolicyType.qiniu || values.type === PolicyType.s3 || + values.type === PolicyType.ks3 || values.type === PolicyType.upyun ); }, [values.type]); @@ -93,7 +94,8 @@ const BasicInfoSection = () => { values.type === PolicyType.oss || values.type === PolicyType.cos || values.type === PolicyType.obs || - values.type === PolicyType.s3 + values.type === PolicyType.s3 || + values.type === PolicyType.ks3 ); }, [values.type]); @@ -345,7 +347,7 @@ const BasicInfoSection = () => { {t("policy.thisIsACustomDomainDes")} )} - {values.type === PolicyType.s3 && ( + {(values.type === PolicyType.s3 || values.type === PolicyType.ks3) && ( <> { label={t("policy.usePathEndpoint")} /> - ]} /> + ]} + /> )} @@ -405,11 +413,15 @@ const BasicInfoSection = () => { )} - {values.type == PolicyType.s3 && ( + {(values.type === PolicyType.s3 || values.type === PolicyType.ks3) && ( - ]} /> + ]} + /> )} @@ -464,7 +476,7 @@ const BasicInfoSection = () => { )} - {values.type === PolicyType.s3 && ( + {(values.type === PolicyType.s3 || values.type === PolicyType.ks3) && ( { ); const noNativeExtractor = useMemo(() => { - return values.type === PolicyType.s3 || values.type === PolicyType.onedrive; + return values.type === PolicyType.s3 || values.type === PolicyType.ks3 || values.type === PolicyType.onedrive; }, [values.type]); if (values.type === PolicyType.local) { diff --git a/src/component/Admin/StoragePolicy/StoragePolicySetting.tsx b/src/component/Admin/StoragePolicy/StoragePolicySetting.tsx index 76a7308..c052f2a 100644 --- a/src/component/Admin/StoragePolicy/StoragePolicySetting.tsx +++ b/src/component/Admin/StoragePolicy/StoragePolicySetting.tsx @@ -28,6 +28,7 @@ import OssWizard from "./Wizards/OSS/OssWizard"; import QiniuWizard from "./Wizards/Qiniu/QiniuWizard"; import RemoteWizard from "./Wizards/Remote/RemoteWizard"; import S3Wizard from "./Wizards/S3/S3Wizard"; +import KS3Wizard from "./Wizards/KS3/KS3Wizard"; import UpyunWizard from "./Wizards/Upyun/UpyunWizard"; export const PageQuery = "page"; @@ -102,6 +103,22 @@ export const PolicyPropsMap: Record = { chunkSizeMax: 5 * 1024 * 1024 * 1024, //5GB chunkSizeDes: "policy.chunkSizeDesS3", }, + [PolicyType.ks3]: { + name: "policy.ks3", + img: "/static/img/ks3.png", + wizardSize: "sm", + wizard: KS3Wizard, + bucketName: "policy.bucketName", + bucketType: "policy.bucketType", + endpointName: "policy.policyEndpoint", + endpointDes: ]} />, + akName: "Access Key", + skName: "Secret Key", + corsExposedHeaders: ["ETag"], + chunkSizeMin: 5 * 1024 * 1024, //5MB + chunkSizeMax: 5 * 1024 * 1024 * 1024, //5GB + chunkSizeDes: "policy.chunkSizeDesS3", + }, [PolicyType.cos]: { name: "policy.cos", img: "/static/img/cos.png", diff --git a/src/component/Admin/StoragePolicy/Wizards/KS3/KS3Wizard.tsx b/src/component/Admin/StoragePolicy/Wizards/KS3/KS3Wizard.tsx new file mode 100644 index 0000000..1852867 --- /dev/null +++ b/src/component/Admin/StoragePolicy/Wizards/KS3/KS3Wizard.tsx @@ -0,0 +1,187 @@ +import { Button, Checkbox, Collapse, FormControl, FormControlLabel, Stack } from "@mui/material"; +import { useSnackbar } from "notistack"; +import { useRef, useState } from "react"; +import { Trans, useTranslation } from "react-i18next"; +import { createStoragePolicyCors } from "../../../../../api/api"; +import { StoragePolicy } from "../../../../../api/dashboard"; +import { PolicyType } from "../../../../../api/explorer"; +import { useAppDispatch } from "../../../../../redux/hooks"; +import { DefaultCloseAction } from "../../../../Common/Snackbar/snackbar"; +import { DenseFilledTextField, SecondaryButton } from "../../../../Common/StyledComponents"; +import SettingForm from "../../../../Pages/Setting/SettingForm"; +import { Code } from "../../../Common/Code"; +import { EndpointInput } from "../../../Common/EndpointInput"; +import { NoMarginHelperText } from "../../../Settings/Settings"; +import { AddWizardProps } from "../../AddWizardDialog"; +import BucketACLInput from "../../EditStoragePolicy/BucketACLInput"; +import BucketCorsTable from "../../EditStoragePolicy/BucketCorsTable"; + +const KS3Wizard = ({ onSubmit }: AddWizardProps) => { + const { t } = useTranslation("dashboard"); + const dispatch = useAppDispatch(); + const [loading, setLoading] = useState(false); + const { enqueueSnackbar } = useSnackbar(); + const [corsAdded, setCorsAdded] = useState(false); + const formRef = useRef(null); + const [policy, setPolicy] = useState({ + id: 0, + node_id: 0, + name: "", + type: PolicyType.ks3, + is_private: true, + dir_name_rule: "uploads/{uid}/{path}", + settings: { + chunk_size: 25 << 20, + media_meta_generator_proxy: true, + thumb_generator_proxy: true, + }, + file_name_rule: "{uuid}_{originname}", + edges: {}, + }); + + const hamdleCreateCors = () => { + if (!formRef.current?.checkValidity()) { + formRef.current?.reportValidity(); + return; + } + setLoading(true); + dispatch(createStoragePolicyCors({ policy })) + .then(() => { + enqueueSnackbar(t("policy.corsPolicyAdded"), { variant: "success", action: DefaultCloseAction }); + setCorsAdded(true); + }) + .finally(() => { + setLoading(false); + }); + }; + + const handleSubmit = () => { + if (!formRef.current?.checkValidity()) { + formRef.current?.reportValidity(); + return; + } + onSubmit(policy); + }; + + return ( +
+ + + setPolicy({ ...policy, name: e.target.value })} + /> + {t("policy.policyName")} + + + setPolicy({ ...policy, bucket_name: e.target.value })} + /> + + + + setPolicy({ ...policy, is_private: value })} + /> + {t("policy.bucketTypeDes")} + + + + setPolicy({ ...policy, server: e.target.value })} + variant={"outlined"} + /> + + ]} /> + + + setPolicy({ + ...policy, + settings: { ...policy.settings, s3_path_style: e.target.checked ? true : undefined }, + }) + } + /> + } + label={t("policy.usePathEndpoint")} + /> + + ]} /> + + + + setPolicy({ ...policy, settings: { ...policy.settings, region: e.target.value } })} + /> + + ]} /> + + + + + setPolicy({ ...policy, access_key: e.target.value })} + /> + setPolicy({ ...policy, secret_key: e.target.value })} + /> + + + + + + {t("policy.ossCORSDes")} + + + + setCorsAdded(true)}> + {t("policy.addedManually")} + + + + + + + +
+ ); +}; + +export default KS3Wizard; diff --git a/src/component/Uploader/core/index.ts b/src/component/Uploader/core/index.ts index baf429c..4300e86 100644 --- a/src/component/Uploader/core/index.ts +++ b/src/component/Uploader/core/index.ts @@ -13,6 +13,7 @@ import ResumeHint from "./uploader/placeholder"; import Qiniu from "./uploader/qiniu"; import Remote from "./uploader/remote"; import S3 from "./uploader/s3"; +import KS3 from "./uploader/ks3"; import Upyun from "./uploader/upyun"; import { cleanupResumeCtx, @@ -130,6 +131,8 @@ export default class UploadManager { return new Upyun(task, this); case PolicyType.s3: return new S3(task, this); + case PolicyType.ks3: + return new KS3(task, this); case PolicyType.obs: return new OBS(task, this); default: diff --git a/src/component/Uploader/core/uploader/base.ts b/src/component/Uploader/core/uploader/base.ts index 591c48d..77ce7af 100644 --- a/src/component/Uploader/core/uploader/base.ts +++ b/src/component/Uploader/core/uploader/base.ts @@ -61,6 +61,7 @@ const resumePolicy = [ PolicyType.oss, PolicyType.onedrive, PolicyType.s3, + PolicyType.ks3, ]; const deleteUploadSessionDelay = 500; diff --git a/src/component/Uploader/core/uploader/ks3.ts b/src/component/Uploader/core/uploader/ks3.ts new file mode 100644 index 0000000..5531837 --- /dev/null +++ b/src/component/Uploader/core/uploader/ks3.ts @@ -0,0 +1,28 @@ +import Chunk, { ChunkInfo } from "./chunk"; +import { s3LikeFinishUpload, s3LikeUploadCallback, s3LikeUploadChunk } from "../api"; +import { Status } from "./base"; +import { PolicyType } from "../../../../api/explorer.ts"; + +export default class KS3 extends Chunk { + protected async uploadChunk(chunkInfo: ChunkInfo) { + const etag = await s3LikeUploadChunk( + this.task.session?.upload_urls[chunkInfo.index]!, + chunkInfo, + (p) => { + this.updateChunkProgress(p.loaded, chunkInfo.index); + }, + this.cancelToken.token, + ); + + this.task.chunkProgress[chunkInfo.index].etag = etag; + } + + protected async afterUpload(): Promise { + this.logger.info(`Finishing multipart upload...`); + this.transit(Status.finishing); + await s3LikeFinishUpload(this.task.session!.completeURL, false, this.task.chunkProgress, this.cancelToken.token); + + this.logger.info(`Sending S3-like upload callback...`); + return s3LikeUploadCallback(this.task.session!.session_id, this.task.session!.callback_secret, PolicyType.ks3); + } +}