From de8ffeaa7b6baa0d016fffe93acd02319fef33c3 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 5 Aug 2022 15:50:11 +0200 Subject: [PATCH 01/12] extract file type from mime type if possible --- packages/core/upload/server/services/upload.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 7c4b3b858c..f0f467339d 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -12,6 +12,7 @@ const crypto = require('crypto'); const fs = require('fs'); const fse = require('fs-extra'); const _ = require('lodash'); +const { extension } = require('mime-types'); const { sanitize, nameToSlug, @@ -67,7 +68,7 @@ module.exports = ({ strapi }) => ({ async formatFileInfo({ filename, type, size }, fileInfo = {}, metas = {}) { const fileService = getService('file'); - const ext = path.extname(filename); + const ext = extension(type) || path.extname(filename); const basename = path.basename(fileInfo.name || filename, ext); const usedName = fileInfo.name || filename; From 97c695f597ad70ae74fb353169d6fd4b0b407033 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Fri, 5 Aug 2022 16:53:41 +0200 Subject: [PATCH 02/12] add prefix to extension --- packages/core/upload/server/services/upload.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index f0f467339d..6af7633c05 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -68,7 +68,8 @@ module.exports = ({ strapi }) => ({ async formatFileInfo({ filename, type, size }, fileInfo = {}, metas = {}) { const fileService = getService('file'); - const ext = extension(type) || path.extname(filename); + let ext = extension(type) || path.extname(filename); + ext = ext.startsWith('.') ? ext : `.${ext}`; const basename = path.basename(fileInfo.name || filename, ext); const usedName = fileInfo.name || filename; From 41dae37e1f92b98433333c9d0c663a2fe7400976 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 8 Aug 2022 09:33:01 +0200 Subject: [PATCH 03/12] get extension from file name --- packages/core/upload/server/services/upload.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 6af7633c05..759137b573 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -68,8 +68,9 @@ module.exports = ({ strapi }) => ({ async formatFileInfo({ filename, type, size }, fileInfo = {}, metas = {}) { const fileService = getService('file'); - let ext = extension(type) || path.extname(filename); - ext = ext.startsWith('.') ? ext : `.${ext}`; + let ext = '.' + extension(type); + // If it is a file , get the extension from the filename. + ext = ext === '.bin' ? path.extname(filename) : '.bin'; const basename = path.basename(fileInfo.name || filename, ext); const usedName = fileInfo.name || filename; From 4de86c492772d732ff20160f58c20ca0a5acbde9 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 8 Aug 2022 09:37:37 +0200 Subject: [PATCH 04/12] get extension from filename when bin --- packages/core/upload/server/services/upload.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 759137b573..a86e260ecc 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -70,7 +70,9 @@ module.exports = ({ strapi }) => ({ let ext = '.' + extension(type); // If it is a file , get the extension from the filename. - ext = ext === '.bin' ? path.extname(filename) : '.bin'; + if (ext === '.bin') { + ext = path.extname(filename); + } const basename = path.basename(fileInfo.name || filename, ext); const usedName = fileInfo.name || filename; From 5a90357622f5f83d13a29d64f1fcf4971d2789aa Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 8 Aug 2022 10:38:42 +0200 Subject: [PATCH 05/12] get extension from mime type if not available --- packages/core/upload/server/services/upload.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index a86e260ecc..86edf1cde8 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -68,10 +68,9 @@ module.exports = ({ strapi }) => ({ async formatFileInfo({ filename, type, size }, fileInfo = {}, metas = {}) { const fileService = getService('file'); - let ext = '.' + extension(type); - // If it is a file , get the extension from the filename. - if (ext === '.bin') { - ext = path.extname(filename); + let ext = path.extname(filename); + if (!ext) { + ext = extension(type); } const basename = path.basename(fileInfo.name || filename, ext); const usedName = fileInfo.name || filename; From 08cb683bd1554fd46bf3c305c78a6ce739fdeda7 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 8 Aug 2022 14:06:30 +0200 Subject: [PATCH 06/12] clean url when uploading media from url --- .../core/upload/admin/src/utils/urlsToAssets.js | 17 ++++++++++++++++- packages/core/upload/server/services/upload.js | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index f680bbb367..d16d820c5b 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -2,6 +2,21 @@ import axios from 'axios'; import { AssetSource } from '../constants'; import { typeFromMime } from './typeFromMime'; +/** + * The URL might have query parameters. + * Remove them to have a clean URL instead. + */ +function cleanURL(url) { + // Break URL at ? and take first part (file name, extension) + url = url.split('?')[0]; + + // Sometimes URL doesn't have ? but # + url = url.split('#')[0]; + + // Cleaned URL + return url; +} + export const urlsToAssets = async urls => { const assetPromises = urls.map(url => axios @@ -10,7 +25,7 @@ export const urlsToAssets = async urls => { timeout: 60000, }) .then(res => { - const loadedFile = new File([res.data], res.config.url, { + const loadedFile = new File([res.data], cleanURL(res.config.url), { type: res.headers['content-type'], }); diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 86edf1cde8..a311683e1c 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -70,7 +70,7 @@ module.exports = ({ strapi }) => ({ let ext = path.extname(filename); if (!ext) { - ext = extension(type); + ext = '.' + extension(type); } const basename = path.basename(fileInfo.name || filename, ext); const usedName = fileInfo.name || filename; From fce7a9112a8afd94708e4b77a17c01a0a27d3f3f Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 8 Aug 2022 14:10:08 +0200 Subject: [PATCH 07/12] change cleanURL description --- packages/core/upload/admin/src/utils/urlsToAssets.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index d16d820c5b..5dd151df31 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -4,9 +4,9 @@ import { typeFromMime } from './typeFromMime'; /** * The URL might have query parameters. - * Remove them to have a clean URL instead. + * Remove them to have a clean URL instead to use as a filename. */ -function cleanURL(url) { +function cleanUrl(url) { // Break URL at ? and take first part (file name, extension) url = url.split('?')[0]; @@ -25,7 +25,7 @@ export const urlsToAssets = async urls => { timeout: 60000, }) .then(res => { - const loadedFile = new File([res.data], cleanURL(res.config.url), { + const loadedFile = new File([res.data], cleanUrl(res.config.url), { type: res.headers['content-type'], }); From 10ea1e4ea2b5ad5c76cab6cfd0075cdb16ed0452 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Tue, 9 Aug 2022 11:43:54 +0200 Subject: [PATCH 08/12] refactor clean url --- packages/core/upload/admin/src/utils/urlsToAssets.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index 5dd151df31..8edc8820e2 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -7,14 +7,7 @@ import { typeFromMime } from './typeFromMime'; * Remove them to have a clean URL instead to use as a filename. */ function cleanUrl(url) { - // Break URL at ? and take first part (file name, extension) - url = url.split('?')[0]; - - // Sometimes URL doesn't have ? but # - url = url.split('#')[0]; - - // Cleaned URL - return url; + return new URL(url).pathname.substring(1); } export const urlsToAssets = async urls => { From 7bf2612a1515d4bddc77ea882f23784e061309e2 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Tue, 9 Aug 2022 18:14:15 +0200 Subject: [PATCH 09/12] use last element of path as filename --- packages/core/upload/admin/src/utils/urlsToAssets.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index 8edc8820e2..4ee02abcd0 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -7,7 +7,7 @@ import { typeFromMime } from './typeFromMime'; * Remove them to have a clean URL instead to use as a filename. */ function cleanUrl(url) { - return new URL(url).pathname.substring(1); + return new URL(url).pathname.split('/').pop(); } export const urlsToAssets = async urls => { From 504c333bcb956bc605ccffdb487d40786b7e4aef Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 10 Aug 2022 09:13:15 +0200 Subject: [PATCH 10/12] change function name to getFilenameFromURL --- packages/core/upload/admin/src/utils/urlsToAssets.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index 4ee02abcd0..c1319ec45d 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -6,7 +6,7 @@ import { typeFromMime } from './typeFromMime'; * The URL might have query parameters. * Remove them to have a clean URL instead to use as a filename. */ -function cleanUrl(url) { +function getFilenameFromURL(url) { return new URL(url).pathname.split('/').pop(); } @@ -18,7 +18,7 @@ export const urlsToAssets = async urls => { timeout: 60000, }) .then(res => { - const loadedFile = new File([res.data], cleanUrl(res.config.url), { + const loadedFile = new File([res.data], getFilenameFromURL(res.config.url), { type: res.headers['content-type'], }); From c7f14a4706b56905d59073a7a355ec31534e71c0 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 10 Aug 2022 09:14:45 +0200 Subject: [PATCH 11/12] remove function comment as it is self explanatory --- packages/core/upload/admin/src/utils/urlsToAssets.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/core/upload/admin/src/utils/urlsToAssets.js b/packages/core/upload/admin/src/utils/urlsToAssets.js index c1319ec45d..9ecfdd475c 100644 --- a/packages/core/upload/admin/src/utils/urlsToAssets.js +++ b/packages/core/upload/admin/src/utils/urlsToAssets.js @@ -2,10 +2,6 @@ import axios from 'axios'; import { AssetSource } from '../constants'; import { typeFromMime } from './typeFromMime'; -/** - * The URL might have query parameters. - * Remove them to have a clean URL instead to use as a filename. - */ function getFilenameFromURL(url) { return new URL(url).pathname.split('/').pop(); } From 59eb1b7a441379b84310fb5c79c9b19027e6f5ad Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Thu, 11 Aug 2022 16:29:04 +0200 Subject: [PATCH 12/12] fix tests failing cause of file name --- .../UploadAssetDialog/tests/UploadAssetDialog.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js b/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js index d1c5b9dd31..8c195d7da8 100644 --- a/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js +++ b/packages/core/upload/admin/src/components/UploadAssetDialog/tests/UploadAssetDialog.test.js @@ -161,7 +161,7 @@ describe('UploadAssetDialog', () => { const assets = [ { - name: 'http://localhost:5000/an-image.png', + name: 'an-image.png', ext: 'png', mime: 'image/png', source: 'url', @@ -170,7 +170,7 @@ describe('UploadAssetDialog', () => { rawFile: new File([''], 'image/png'), }, { - name: 'http://localhost:5000/a-pdf.pdf', + name: 'a-pdf.pdf', ext: 'pdf', mime: 'application/pdf', source: 'url', @@ -179,7 +179,7 @@ describe('UploadAssetDialog', () => { rawFile: new File([''], 'application/pdf'), }, { - name: 'http://localhost:5000/a-video.mp4', + name: 'a-video.mp4', ext: 'mp4', mime: 'video/mp4', source: 'url', @@ -188,7 +188,7 @@ describe('UploadAssetDialog', () => { rawFile: new File([''], 'video/mp4'), }, { - name: 'http://localhost:5000/not-working-like-cors.lutin', + name: 'not-working-like-cors.lutin', ext: 'lutin', mime: 'application/json', source: 'url',