From 3c2113a6e74b5121ba46db5846fa355c31852c73 Mon Sep 17 00:00:00 2001 From: Cohee <18619528+Cohee1207@users.noreply.github.com> Date: Mon, 19 Feb 2024 00:17:23 +0200 Subject: [PATCH] Add ability to preserve file names when loading from assets downloader --- public/script.js | 19 ++++++++++++++++--- public/scripts/extensions/assets/index.js | 2 +- src/endpoints/characters.js | 14 +++++++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/public/script.js b/public/script.js index 066a02f99..b9df03842 100644 --- a/public/script.js +++ b/public/script.js @@ -7764,7 +7764,13 @@ async function connectAPISlash(_, text) { } } -export async function processDroppedFiles(files) { +/** + * Imports supported files dropped into the app window. + * @param {File[]} files Array of files to process + * @param {boolean?} preserveFileNames Whether to preserve original file names + * @returns {Promise} + */ +export async function processDroppedFiles(files, preserveFileNames = false) { const allowedMimeTypes = [ 'application/json', 'image/png', @@ -7776,14 +7782,20 @@ export async function processDroppedFiles(files) { for (const file of files) { if (allowedMimeTypes.includes(file.type)) { - await importCharacter(file); + await importCharacter(file, preserveFileNames); } else { toastr.warning('Unsupported file type: ' + file.name); } } } -async function importCharacter(file) { +/** + * Imports a character from a file. + * @param {File} file File to import + * @param {boolean?} preserveFileName Whether to preserve original file name + * @returns {Promise} + */ +async function importCharacter(file, preserveFileName = false) { const ext = file.name.match(/\.(\w+)$/); if (!ext || !(['json', 'png', 'yaml', 'yml'].includes(ext[1].toLowerCase()))) { return; @@ -7794,6 +7806,7 @@ async function importCharacter(file) { const formData = new FormData(); formData.append('avatar', file); formData.append('file_type', format); + formData.append('preserve_file_name', String(preserveFileName)); const data = await jQuery.ajax({ type: 'POST', diff --git a/public/scripts/extensions/assets/index.js b/public/scripts/extensions/assets/index.js index b07fa7b32..d9b612af7 100644 --- a/public/scripts/extensions/assets/index.js +++ b/public/scripts/extensions/assets/index.js @@ -236,7 +236,7 @@ async function installAsset(url, assetType, filename) { console.debug(DEBUG_PREFIX, 'Importing character ', filename); const blob = await result.blob(); const file = new File([blob], filename, { type: blob.type }); - await processDroppedFiles([file]); + await processDroppedFiles([file], true); console.debug(DEBUG_PREFIX, 'Character downloaded.'); } } diff --git a/src/endpoints/characters.js b/src/endpoints/characters.js index 0cd1c4a02..0dcefbc97 100644 --- a/src/endpoints/characters.js +++ b/src/endpoints/characters.js @@ -796,6 +796,17 @@ function getPngName(file) { return file; } +/** + * Gets the preserved name for the uploaded file if the request is valid. + * @param {import("express").Request} request - Express request object + * @returns {string | undefined} - The preserved name if the request is valid, otherwise undefined + */ +function getPreservedName(request) { + return request.body.file_type === 'png' && request.body.preserve_file_name === 'true' && request.file?.originalname + ? path.parse(request.file.originalname).name + : undefined; +} + router.post('/import', urlencodedParser, async function (request, response) { if (!request.body || !request.file) return response.sendStatus(400); @@ -803,6 +814,7 @@ router.post('/import', urlencodedParser, async function (request, response) { let filedata = request.file; let uploadPath = path.join(UPLOADS_PATH, filedata.filename); let format = request.body.file_type; + const preservedFileName = getPreservedName(request); if (format == 'yaml' || format == 'yml') { try { @@ -894,7 +906,7 @@ router.post('/import', urlencodedParser, async function (request, response) { let jsonData = JSON.parse(img_data); jsonData.name = sanitize(jsonData.data?.name || jsonData.name); - png_name = getPngName(jsonData.name); + png_name = preservedFileName || getPngName(jsonData.name); if (jsonData.spec !== undefined) { console.log('Found a v2 character file.');