diff --git a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js index 43c547bb17..ff376a451b 100644 --- a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js +++ b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/ButtonComponent.js @@ -8,7 +8,6 @@ import { TenantStatus } from "@docspace/common/constants"; import { startRestore } from "@docspace/common/api/portal"; import { combineUrl } from "@docspace/common/utils"; import toastr from "@docspace/components/toast/toastr"; -import { request } from "@docspace/common/api/client"; const ButtonContainer = (props) => { const { @@ -28,29 +27,12 @@ const ButtonContainer = (props) => { setTenantStatus, isFormReady, getStorageParams, + uploadLocalFile, } = props; const [isUploadingLocalFile, setIsUploadingLocalFile] = useState(false); const [isLoading, setIsLoading] = useState(false); - const localFileUploading = async () => { - try { - const checkedFile = await request({ - baseURL: combineUrl(window.DocSpaceConfig?.proxy?.url, config.homepage), - method: "post", - url: `/backupFileUpload.ashx`, - responseType: "text", - data: restoreResource, - }); - - return checkedFile; - } catch (e) { - toastr.error(e); - setIsUploadingLocalFile(false); - return null; - } - }; - const onRestoreClick = async () => { if (isCheckedThirdPartyStorage) { const requiredFieldsFilled = isFormReady(); @@ -74,7 +56,7 @@ const ButtonContainer = (props) => { } if (isCheckedLocalFile) { - const isUploadedFile = await localFileUploading(); + const isUploadedFile = await uploadLocalFile(); if (!isUploadedFile) { setIsLoading(false); @@ -89,6 +71,7 @@ const ButtonContainer = (props) => { } } + return; try { await startRestore(backupId, storageType, storageParams, isNotification); setTenantStatus(TenantStatus.PortalRestore); @@ -154,11 +137,13 @@ export default inject(({ auth, backup }) => { isFormReady, getStorageParams, restoreResource, + uploadLocalFile, } = backup; const { isRestoreAndAutoBackupAvailable } = currentQuotaStore; const isMaxProgress = downloadingProgress === 100; return { + uploadLocalFile, isMaxProgress, setTenantStatus, isEnableRestore: isRestoreAndAutoBackupAvailable, diff --git a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js index 18d689282c..e28431797f 100644 --- a/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js +++ b/packages/client/src/pages/PortalSettings/categories/data-management/backup/restore-backup/sub-components/LocalFileModule.js @@ -5,10 +5,10 @@ import FileInput from "@docspace/components/file-input"; const LocalFile = ({ setRestoreResource, isEnableRestore, t }) => { const onClickInput = (file) => { - let data = new FormData(); - data.append("file", file); + //let data = new FormData(); + // data.append("file", file); - setRestoreResource(data); + setRestoreResource(file); }; return ( diff --git a/packages/client/src/store/BackupStore.js b/packages/client/src/store/BackupStore.js index 334880c489..afabc0cb48 100644 --- a/packages/client/src/store/BackupStore.js +++ b/packages/client/src/store/BackupStore.js @@ -8,6 +8,10 @@ import { import toastr from "@docspace/components/toast/toastr"; import { AutoBackupPeriod } from "@docspace/common/constants"; //import api from "@docspace/common/api"; +import { request } from "@docspace/common/api/client"; +import { combineUrl } from "@docspace/common/utils"; +import config from "PACKAGE_FILE"; +import { uploadBackup } from "@docspace/common/api/files"; const { EveryDayType, EveryWeekType } = AutoBackupPeriod; @@ -617,6 +621,69 @@ class BackupStore { setRestoreResource = (value) => { this.restoreResource = value; }; + + setChunkUploadSize = (chunkUploadSize) => { + this.chunkUploadSize = chunkUploadSize; + }; + + uploadFileChunks = async (requestsDataArray) => { + const length = requestsDataArray.length; + + for (let index = 0; index < length; index++) { + const res = await uploadBackup( + combineUrl( + window.DocSpaceConfig?.proxy?.url, + config.homepage, + "/backupFileUpload.ashx" + ), + requestsDataArray[index] + ); + console.log("=== CHUNKS res", res); + if (res.data.Message) return Promise.reject(res.data.Message); + } + }; + uploadLocalFile = async () => { + console.log("this.restoreResource", this.restoreResource); + + try { + const res = await uploadBackup( + combineUrl( + window.DocSpaceConfig?.proxy?.url, + config.homepage, + `/backupFileUpload.ashx?init=true&totalSize=${this.restoreResource.size}` + ) + ); + + const chunkUploadSize = res.data.ChunkSize; + + const chunks = Math.ceil( + this.restoreResource.size / chunkUploadSize, + chunkUploadSize + ); + + const requestsDataArray = []; + + let chunk = 0; + + while (chunk < chunks) { + const offset = chunk * chunkUploadSize; + const formData = new FormData(); + formData.append( + "file", + this.restoreResource.slice(offset, offset + chunkUploadSize) + ); + + requestsDataArray.push(formData); + chunk++; + } + + console.log("res", res, requestsDataArray, chunk); + await this.uploadFileChunks(requestsDataArray); + } catch (e) { + toastr.error(e); + return null; + } + }; } export default BackupStore; diff --git a/packages/common/api/files/index.js b/packages/common/api/files/index.js index 3f0fd73251..2cdd4e147f 100644 --- a/packages/common/api/files/index.js +++ b/packages/common/api/files/index.js @@ -560,6 +560,10 @@ export function uploadFile(url, data) { return axios.post(url, data); } +export function uploadBackup(url, data) { + return axios.post(url, data); +} + export function downloadFiles(fileIds, folderIds) { const data = { fileIds, folderIds }; return request({ method: "put", url: "/files/fileops/bulkdownload", data });