From a60467889dbcc4ddaa36b94c190a606b1174a36e Mon Sep 17 00:00:00 2001 From: Convly Date: Wed, 23 Nov 2022 18:29:51 +0100 Subject: [PATCH] Add media export capabilities for strapi source & fil file destination provider --- .../local-file-destination-provider.ts | 43 +++++++++++++------ .../local-strapi-source-provider/media.ts | 20 +++++---- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/packages/core/data-transfer/lib/providers/local-file-destination-provider.ts b/packages/core/data-transfer/lib/providers/local-file-destination-provider.ts index c1380f8201..d85c5aeadb 100644 --- a/packages/core/data-transfer/lib/providers/local-file-destination-provider.ts +++ b/packages/core/data-transfer/lib/providers/local-file-destination-provider.ts @@ -237,21 +237,38 @@ class LocalFileDestinationProvider implements IDestinationProvider { } getMediaStream(): NodeJS.WritableStream { - return chain([ - (data) => { - console.log(data.file); - return data; - }, - (data) => { - const fsStream = fs.createWriteStream(path.join(this.options.file.path, data.file)); - data.stream.pipe(fsStream); - fsStream.on('close', () => { - console.log('closed', data.file); - data.stream.destroy(); + const { stream: archiveStream } = this.#archive; + + if (!archiveStream) { + throw new Error('Archive stream is unavailable'); + } + + return new Writable({ + objectMode: true, + write(data, _encoding, callback) { + const entryPath = path.join('media', 'uploads', data.file); + + const entry = archiveStream.entry({ + name: entryPath, + size: data.stats.size, }); - return data; + + if (!entry) { + callback(new Error(`Failed to created a tar entry for ${entryPath}`)); + return; + } + + data.stream.pipe(entry); + + entry + .on('finish', () => { + callback(null); + }) + .on('error', (error) => { + callback(error); + }); }, - ]); + }); } } diff --git a/packages/core/data-transfer/lib/providers/local-strapi-source-provider/media.ts b/packages/core/data-transfer/lib/providers/local-strapi-source-provider/media.ts index e7305f7d06..66a7cde2a2 100644 --- a/packages/core/data-transfer/lib/providers/local-strapi-source-provider/media.ts +++ b/packages/core/data-transfer/lib/providers/local-strapi-source-provider/media.ts @@ -10,15 +10,17 @@ const IGNORED_FILES = ['.gitkeep']; export const createMediaStream = (strapi: Strapi.Strapi): Duplex => { const mediaDirectory = path.join(strapi.dirs.static.public, 'uploads'); - return Duplex.from(function* () { - const files = fs.readdirSync(mediaDirectory).filter((file) => !IGNORED_FILES.includes(file)); + return Duplex.from( + (function* () { + const files = fs.readdirSync(mediaDirectory).filter((file) => !IGNORED_FILES.includes(file)); - for (const file of files) { - const filePath = path.join(mediaDirectory, file); - const stats = fs.statSync(filePath); - const stream = fs.createReadStream(filePath); + for (const file of files) { + const filePath = path.join(mediaDirectory, file); + const stats = fs.statSync(filePath); + const stream = fs.createReadStream(filePath); - yield { file, path: filePath, stats, stream }; - } - }); + yield { file, path: filePath, stats, stream }; + } + })() + ); };