All: Improve how resource filenames are determined (#15672)

This commit is contained in:
Henry Heino authored and GitHub committed 2026-06-12 18:28:20 +01:00
1 parent 62bab6ece5
commit 5051807374
4 files changed
+25 -3

No files matched your search

+1
View File
@@ -1433,6 +1433,7 @@ packages/lib/models/utils/paginatedFeed.js
packages/lib/models/utils/paginationToSql.js
packages/lib/models/utils/readOnly.test.js
packages/lib/models/utils/readOnly.js
packages/lib/models/utils/resourceUtils.test.js
packages/lib/models/utils/resourceUtils.js
packages/lib/models/utils/types.js
packages/lib/models/utils/userData.test.js
+1
View File
@@ -1406,6 +1406,7 @@ packages/lib/models/utils/paginatedFeed.js
packages/lib/models/utils/paginationToSql.js
packages/lib/models/utils/readOnly.test.js
packages/lib/models/utils/readOnly.js
packages/lib/models/utils/resourceUtils.test.js
packages/lib/models/utils/resourceUtils.js
packages/lib/models/utils/types.js
packages/lib/models/utils/userData.test.js
@@ -0,0 +1,18 @@
import { resourceFilename } from './resourceUtils';
describe('resourceUtils', () => {
it.each([
{
id: 'this/is a test',
mime: 'text/plain',
expected: 'this_is_a_test.txt',
},
{
id: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
mime: 'application/json',
expected: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.json',
},
])('should correctly determine resource filenames (case %#)', ({ id, mime, expected }) => {
expect(resourceFilename({ id, mime })).toBe(expected);
});
});
+5 -3
View File
@@ -1,6 +1,6 @@
import type { ResourceEntity } from '../../services/database/types';
import * as mime from '../../mime-utils';
import { filename } from '@joplin/utils/path';
import { filename, safeFileExtension } from '@joplin/utils/path';
// This file contains resource-related utilities that do not
// depend on the database, settings, etc.
@@ -8,8 +8,10 @@ import { filename } from '@joplin/utils/path';
export const resourceFilename = (resource: ResourceEntity, encryptedBlob = false) => {
let extension = encryptedBlob ? 'crypted' : resource.file_extension;
if (!extension) extension = resource.mime ? mime.toFileExtension(resource.mime) : '';
extension = extension ? `.${extension}` : '';
return resource.id + extension;
extension = extension ? `.${safeFileExtension(extension)}` : '';
// Resource IDs should contain only alphanumeric characters
const idComponent = resource.id.replace(/[^a-zA-Z0-9]/g, '_');
return idComponent + extension;
};
export const resourceRelativePath = (resource: ResourceEntity, relativeResourceDirPath: string, encryptedBlob = false) => {