From 7b6d32a8a93273a3c26596293352a0abe9274e4a Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Sat, 25 Jan 2025 19:44:22 +0000 Subject: [PATCH] support folder upload for b2 service --- .../remoteUpload/providers/b2/index.js | 51 +++++++++++++++---- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/packages/server/services/files/services/remoteUpload/providers/b2/index.js b/packages/server/services/files/services/remoteUpload/providers/b2/index.js index cb3cfdfe..f9ba8a5b 100644 --- a/packages/server/services/files/services/remoteUpload/providers/b2/index.js +++ b/packages/server/services/files/services/remoteUpload/providers/b2/index.js @@ -1,23 +1,58 @@ import fs from "node:fs" import path from "node:path" +import pMap from "p-map" -export default async ({ +export default async function b2Upload({ source, remotePath, metadata = {}, targetFilename, isDirectory, -}) => { - // use backblaze b2 +}) { + if (isDirectory) { + let files = await fs.promises.readdir(source) + + files = files.map((file) => { + const filePath = path.join(source, file) + + const isTargetDirectory = fs.lstatSync(filePath).isDirectory() + + return { + source: filePath, + remotePath: path.join(remotePath, file), + isDirectory: isTargetDirectory, + } + }) + + await pMap( + files, + b2Upload, + { + concurrency: 5 + } + ) + + return { + id: remotePath, + url: `https://${process.env.B2_CDN_ENDPOINT}/${process.env.B2_BUCKET}/${remotePath}/${targetFilename}`, + metadata: metadata, + } + } + await global.b2Storage.authorize() + if (!fs.existsSync(source)) { + throw new OperationError(500, "File not found") + } + const uploadUrl = await global.b2Storage.getUploadUrl({ bucketId: process.env.B2_BUCKET_ID, }) - if (!fs.existsSync(source)) { - throw new OperationError(500, "File not found") - } + console.debug(`Uploading object to B2 Storage >`, { + source: source, + remote: remotePath, + }) const data = await fs.promises.readFile(source) @@ -29,11 +64,9 @@ export default async ({ info: metadata }) - const url = `https://${process.env.B2_CDN_ENDPOINT}/${process.env.B2_BUCKET}/${remotePath}` - return { id: remotePath, - url: url, + url: `https://${process.env.B2_CDN_ENDPOINT}/${process.env.B2_BUCKET}/${remotePath}`, metadata: metadata, } } \ No newline at end of file