feat(uploader): concurrent chunk uploads for local/remote storage policy

This commit is contained in:
Aaron Liu 2025-08-30 10:36:46 +08:00
parent a095f8c612
commit 35961604a1
12 changed files with 54 additions and 35 deletions

View File

@ -816,7 +816,7 @@
"nativeThumbNailsGeneralObs": "Für Huawei Cloud OBS-Speicher wird der <0>Bildverarbeitungsservice</0> verwendet, um Miniaturbilder zu generieren.",
"nativeThumbNailsGeneralUpyun": "Für Upyun-Speicher wird der <0>Bildverarbeitungsservice</0> verwendet, um Miniaturbilder zu generieren.",
"preallocate": "Festplattenspeicher vorab zuweisen",
"preallocateDes": "Wenn aktiviert, wird der Upload-Anfrage des Benutzers Festplattenspeicher auf dem Speicherknoten vorab zugewiesen, nur wirksam unter Linux oder Darwin.",
"preallocateDes": "Wenn aktiviert, wird der Upload-Anfrage des Benutzers Festplattenspeicher auf dem Speicherknoten vorab zugewiesen, und unterstützt auch parallele Chunk-Uploads. Nur wirksam unter Linux oder Darwin.",
"chunkConcurrency": "Parallele Chunk-Uploads",
"chunkConcurrencyDes": "Legt die Anzahl der gleichzeitigen Chunk-Uploads beim direkten Web-Upload fest.",
"sourceWebEdit": "Web-Online-Bearbeitung",

View File

@ -817,7 +817,7 @@
"nativeThumbNailsGeneralObs": "For Huawei Cloud OBS storage, <0>image processing</0> service will be used to generate thumbnails.",
"nativeThumbNailsGeneralUpyun": "For Upyun storage, <0>image processing</0> service will be used to generate thumbnails.",
"preallocate": "Pre-allocate disk space",
"preallocateDes": "When enabled, the user's upload request will be pre-allocated disk space on the storage node, only effective on Linux or Darwin.",
"preallocateDes": "When enabled, the user's upload request will be pre-allocated disk space on the storage node, and also supports parallel chunk upload. Only effective on Linux or Darwin.",
"chunkConcurrency": "Concurrent chunk uploads",
"chunkConcurrencyDes": "Set the number of concurrent chunk uploads when using direct web upload.",
"sourceWebEdit": "Web online editing",

View File

@ -816,7 +816,7 @@
"nativeThumbNailsGeneralObs": "Para almacenamiento Huawei Cloud OBS, el servicio de <0>procesamiento de imágenes</0> se usará para generar miniaturas.",
"nativeThumbNailsGeneralUpyun": "Para almacenamiento Upyun, el servicio de <0>procesamiento de imágenes</0> se usará para generar miniaturas.",
"preallocate": "Pre-asignar espacio en disco",
"preallocateDes": "Cuando esté habilitado, la solicitud de subida del usuario pre-asignará espacio en disco en el nodo de almacenamiento, solo efectivo en Linux o Darwin.",
"preallocateDes": "Cuando esté habilitado, la solicitud de subida del usuario pre-asignará espacio en disco en el nodo de almacenamiento, y también admite la carga paralela de fragmentos. Solo efectivo en Linux o Darwin.",
"chunkConcurrency": "Subidas de fragmentos concurrentes",
"chunkConcurrencyDes": "Establece el número de subidas de fragmentos concurrentes al usar subida directa web.",
"sourceWebEdit": "Edición en línea web",

View File

@ -816,7 +816,7 @@
"nativeThumbNailsGeneralObs": "Pour le stockage Huawei Cloud OBS, le service de <0>traitement d'images</0> sera utilisé pour générer des miniatures.",
"nativeThumbNailsGeneralUpyun": "Pour le stockage Upyun, le service de <0>traitement d'images</0> sera utilisé pour générer des miniatures.",
"preallocate": "Pré-allouer l'espace disque",
"preallocateDes": "Lorsqu'activé, la demande d'upload de l'utilisateur pré-allouera l'espace disque sur le nœud de stockage, efficace seulement sur Linux ou Darwin.",
"preallocateDes": "Lorsqu'activé, la demande d'upload de l'utilisateur pré-allouera l'espace disque sur le nœud de stockage, et prend également en charge le téléchargement parallèle de chunks. Efficace seulement sur Linux ou Darwin.",
"chunkConcurrency": "Uploads de chunks concurrents",
"chunkConcurrencyDes": "Définit le nombre d'uploads de chunks concurrents lors de l'utilisation de l'upload direct web.",
"sourceWebEdit": "Édition en ligne Web",

View File

@ -816,7 +816,7 @@
"nativeThumbNailsGeneralObs": "Per l'archiviazione Huawei Cloud OBS, verrà utilizzato il servizio <0>elaborazione immagini</0> per generare miniature.",
"nativeThumbNailsGeneralUpyun": "Per l'archiviazione Upyun, verrà utilizzato il servizio <0>elaborazione immagini</0> per generare miniature.",
"preallocate": "Pre-alloca spazio disco",
"preallocateDes": "Quando abilitato, la richiesta di caricamento dell'utente pre-allocherà spazio disco sul nodo di archiviazione, efficace solo su Linux o Darwin.",
"preallocateDes": "Quando abilitato, la richiesta di caricamento dell'utente pre-allocherà spazio disco sul nodo di archiviazione, e supporta anche il caricamento parallelo di chunk. Efficace solo su Linux o Darwin.",
"chunkConcurrency": "Caricamenti chunk concorrenti",
"chunkConcurrencyDes": "Imposta il numero di caricamenti chunk concorrenti quando si utilizza il caricamento diretto web.",
"sourceWebEdit": "Modifica online web",

View File

@ -817,7 +817,7 @@
"nativeThumbNailsGeneralObs": "Huawei Cloud OBSストレージの場合、<0>画像処理</0>サービスを使用してサムネイルを生成します。",
"nativeThumbNailsGeneralUpyun": "Upyun ストレージの場合、<0>画像処理</0>サービスを使用してサムネイルを生成します。",
"preallocate": "ディスク領域の事前割り当て",
"preallocateDes": "有効にすると、ユーザーがファイルをアップロードする際にディスク領域が事前に割り当てられます。LinuxまたはDarwinでのみ有効です。",
"preallocateDes": "有効にすると、ユーザーがファイルをアップロードする際にディスク領域が事前に割り当てられ、同時に並行チャンクアップロードもサポートします。LinuxまたはDarwinでのみ有効です。",
"chunkConcurrency": "並行チャンクアップロード数",
"chunkConcurrencyDes": "Webダイレクトアップロード時の並行チャンクアップロード数を設定します。",
"sourceWebEdit": "Webオンライン編集",

View File

@ -817,7 +817,7 @@
"nativeThumbNailsGeneralObs": "Huawei Cloud OBS 스토리지의 경우 <0>이미지 처리</0> 서비스를 사용하여 썸네일을 생성합니다.",
"nativeThumbNailsGeneralUpyun": "Upyun 스토리지의 경우 <0>이미지 처리</0> 서비스를 사용하여 썸네일을 생성합니다.",
"preallocate": "하드 디스크 공간 사전 할당",
"preallocateDes": "활성화하면 사용자가 파일을 업로드할 때 하드 디스크 공간을 미리 할당하며, Linux 또는 Darwin에서만 유효합니다.",
"preallocateDes": "활성화하면 사용자가 파일을 업로드할 때 하드 디스크 공간을 미리 할당하며, 동시에 병렬 청크 업로드도 지원합니다. Linux 또는 Darwin에서만 유효합니다.",
"chunkConcurrency": "병렬 청크 업로드 수",
"chunkConcurrencyDes": "웹 직접 업로드 시 동시 진행되는 청크 업로드 수를 설정합니다.",
"sourceWebEdit": "웹 온라인 편집",

View File

@ -816,7 +816,7 @@
"nativeThumbNailsGeneralObs": "Para armazenamento Huawei Cloud OBS, o serviço de <0>processamento de imagem</0> será usado para gerar miniaturas.",
"nativeThumbNailsGeneralUpyun": "Para armazenamento Upyun, o serviço de <0>processamento de imagem</0> será usado para gerar miniaturas.",
"preallocate": "Pré-alocar espaço em disco",
"preallocateDes": "Quando habilitado, a solicitação de upload do usuário pré-alocará espaço em disco no nó de armazenamento, eficaz apenas no Linux ou Darwin.",
"preallocateDes": "Quando habilitado, a solicitação de upload do usuário pré-alocará espaço em disco no nó de armazenamento, e também suporta upload paralelo de chunks. Eficaz apenas no Linux ou Darwin.",
"chunkConcurrency": "Uploads de chunk concorrentes",
"chunkConcurrencyDes": "Define o número de uploads de chunk concorrentes ao usar upload direto da web.",
"sourceWebEdit": "Edição online na Web",

View File

@ -818,7 +818,7 @@
"nativeThumbNailsGeneralObs": "Для хранилища Huawei Cloud OBS будет использоваться служба <0>обработки изображений</0> для генерации миниатюр.",
"nativeThumbNailsGeneralUpyun": "Для хранилища Upyun будет использоваться служба <0>обработки изображений</0> для генерации миниатюр.",
"preallocate": "Предварительное выделение дискового пространства",
"preallocateDes": "При включении дисковое пространство будет предварительно выделяться при загрузке файлов пользователями. Действует только в Linux или Darwin.",
"preallocateDes": "При включении дисковое пространство будет предварительно выделяться при загрузке файлов пользователями, а также поддерживает параллельную загрузку фрагментов. Действует только в Linux или Darwin.",
"chunkConcurrency": "Параллельная загрузка фрагментов",
"chunkConcurrencyDes": "Устанавливает количество параллельных загрузок фрагментов при прямой веб-загрузке.",
"sourceWebEdit": "Веб-редактирование онлайн",

View File

@ -817,7 +817,7 @@
"nativeThumbNailsGeneralObs": "对于华为云 OBS 存储,<0>图片处理</0>服务会被用来生成缩略图。",
"nativeThumbNailsGeneralUpyun": "对于又拍云存储,<0>图片处理</0>服务会被用来生成缩略图。",
"preallocate": "预分配硬盘空间",
"preallocateDes": "开启后,用户上传文件时会预先分配硬盘空间,只在 Linux 或 Darwin 下有效。",
"preallocateDes": "开启后,用户上传文件时会预先分配硬盘空间,同时也可支持并行分片上传。只在 Linux 或 Darwin 下有效。",
"chunkConcurrency": "并行上传分片数",
"chunkConcurrencyDes": "设定 Web 端直传时,同时进行的分片上传数量。",
"sourceWebEdit": "Web 在线编辑",

View File

@ -817,7 +817,7 @@
"nativeThumbNailsGeneralObs": "對於華為雲 OBS 儲存,<0>圖片處理</0>服務會被用來生成縮圖。",
"nativeThumbNailsGeneralUpyun": "對於又拍雲端儲存,<0>圖片處理</0>服務會被用來生成縮圖。",
"preallocate": "預分配硬碟空間",
"preallocateDes": "開啟後,使用者上傳檔案時會預先分配硬碟空間,只在 Linux 或 Darwin 下有效。",
"preallocateDes": "開啟後,使用者上傳檔案時會預先分配硬碟空間,同時也可支援並行分片上傳。只在 Linux 或 Darwin 下有效。",
"chunkConcurrency": "並行上傳分片數",
"chunkConcurrencyDes": "設定 Web 端直傳時,同時進行的分片上傳數量。",
"sourceWebEdit": "Web 線上編輯",

View File

@ -1,4 +1,13 @@
import { FormControl, FormControlLabel, InputAdornment, Link, MenuItem, Switch, Typography } from "@mui/material";
import {
Collapse,
FormControl,
FormControlLabel,
InputAdornment,
Link,
MenuItem,
Switch,
Typography,
} from "@mui/material";
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
import { Trans, useTranslation } from "react-i18next";
import { StoragePolicy } from "../../../../../api/dashboard";
@ -29,6 +38,19 @@ const StorageAndUploadSection = () => {
return values.type === PolicyType.local || values.type === PolicyType.remote;
}, [values.type]);
const showChunkConcurrency = useMemo(() => {
return (
values.type === PolicyType.s3 ||
values.type === PolicyType.local ||
values.type === PolicyType.remote ||
values.type === PolicyType.ks3 ||
values.type === PolicyType.cos ||
values.type === PolicyType.obs ||
values.type === PolicyType.oss ||
values.type === PolicyType.qiniu
);
}, [values.type]);
const onDirNameChange = useCallback(
(e: React.ChangeEvent<HTMLInputElement>) => {
setPolicy((p: StoragePolicy) => ({ ...p, dir_name_rule: e.target.value }));
@ -362,29 +384,26 @@ const StorageAndUploadSection = () => {
</FormControl>
</SettingForm>
)}
{(values.type === PolicyType.s3 ||
values.type === PolicyType.ks3 ||
values.type === PolicyType.cos ||
values.type === PolicyType.obs ||
values.type === PolicyType.oss ||
values.type === PolicyType.qiniu) && (
<SettingForm lgWidth={5} title={t("policy.chunkConcurrency")}>
<FormControl fullWidth>
<DenseFilledTextField
value={values.settings?.chunk_concurrency ?? 1}
onChange={onChunkConcurrencyChange}
slotProps={{
htmlInput: {
type: "number",
min: 1,
mac: 10,
},
}}
/>
<NoMarginHelperText>{t("policy.chunkConcurrencyDes")}</NoMarginHelperText>
</FormControl>
</SettingForm>
)}
<Collapse in={(!showPreallocate || values.settings?.pre_allocate) && showChunkConcurrency} unmountOnExit>
{showChunkConcurrency && (
<SettingForm lgWidth={5} title={t("policy.chunkConcurrency")}>
<FormControl fullWidth>
<DenseFilledTextField
value={values.settings?.chunk_concurrency ?? 1}
onChange={onChunkConcurrencyChange}
slotProps={{
htmlInput: {
type: "number",
min: 1,
mac: 10,
},
}}
/>
<NoMarginHelperText>{t("policy.chunkConcurrencyDes")}</NoMarginHelperText>
</FormControl>
</SettingForm>
)}
</Collapse>
{values.type !== PolicyType.local && (
<>
<SettingForm lgWidth={5}>