Skip to content

Commit 43b4b22

Browse files
fix: svg uploads allowed when glob (#13356)
Builds on top of #13276 and allows images/* to also parse and accept svg files correctly.
1 parent 3b9dba8 commit 43b4b22

File tree

6 files changed

+64
-1
lines changed

6 files changed

+64
-1
lines changed

packages/payload/src/uploads/checkFileRestrictions.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ export const checkFileRestrictions = async ({
7575
// Handle SVG files that are detected as XML due to <?xml declarations
7676
if (
7777
detected?.mime === 'application/xml' &&
78-
configMimeTypes.some((type) => type.includes('svg')) &&
78+
configMimeTypes.some(
79+
(type) => type.includes('image/') && (type.includes('svg') || type === 'image/*'),
80+
) &&
7981
detectSvgFromXml(file.data)
8082
) {
8183
detected = { ext: 'svg' as any, mime: 'image/svg+xml' as any }

test/uploads/.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,10 @@ focal-no-sizes
33
media
44
uploads
55
versions
6+
with-any-image-type
7+
with-meta-data
8+
with-only-jpeg-meta-data
9+
without-meta-data
10+
svg-only
611
/media-gif
712
/custom-file-name-media
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { CollectionConfig } from 'payload'
2+
3+
import { fileURLToPath } from 'node:url'
4+
import path from 'path'
5+
6+
import { anyImagesSlug } from '../../shared.js'
7+
const filename = fileURLToPath(import.meta.url)
8+
const dirname = path.dirname(filename)
9+
10+
export const AnyImageTypeCollection: CollectionConfig = {
11+
slug: anyImagesSlug,
12+
upload: {
13+
staticDir: path.resolve(dirname, '../../with-any-image-type'),
14+
mimeTypes: ['image/*'],
15+
},
16+
admin: {
17+
enableRichTextRelationship: false,
18+
},
19+
fields: [],
20+
}

test/uploads/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { AdminThumbnailFunction } from './collections/AdminThumbnailFunction/ind
1111
import { AdminThumbnailSize } from './collections/AdminThumbnailSize/index.js'
1212
import { AdminThumbnailWithSearchQueries } from './collections/AdminThumbnailWithSearchQueries/index.js'
1313
import { AdminUploadControl } from './collections/AdminUploadControl/index.js'
14+
import { AnyImageTypeCollection } from './collections/AnyImageType/index.js'
1415
import { BulkUploadsCollection } from './collections/BulkUploads/index.js'
1516
import { CustomUploadFieldCollection } from './collections/CustomUploadField/index.js'
1617
import { FileMimeType } from './collections/FileMimeType/index.js'
@@ -713,6 +714,7 @@ export default buildConfigWithDefaults({
713714
},
714715
Uploads1,
715716
Uploads2,
717+
AnyImageTypeCollection,
716718
AdminThumbnailFunction,
717719
AdminThumbnailWithSearchQueries,
718720
AdminThumbnailSize,

test/uploads/int.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { initPayloadInt } from '../helpers/initPayloadInt.js'
1414
import { createStreamableFile } from './createStreamableFile.js'
1515
import {
1616
allowListMediaSlug,
17+
anyImagesSlug,
1718
enlargeSlug,
1819
focalNoSizesSlug,
1920
focalOnlySlug,
@@ -385,6 +386,38 @@ describe('Collections - Uploads', () => {
385386

386387
expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true)
387388
})
389+
390+
it('should create documents when passing file', async () => {
391+
const expectedPath = path.join(dirname, './with-any-image-type')
392+
393+
const svgFilePath = path.resolve(dirname, './svgWithXml.svg')
394+
const fileBuffer = fs.readFileSync(svgFilePath)
395+
const doc = await payload.create({
396+
collection: anyImagesSlug as CollectionSlug,
397+
data: {},
398+
file: {
399+
data: fileBuffer,
400+
mimetype: 'image/svg+xml',
401+
name: 'svgWithXml.svg',
402+
size: fileBuffer.length,
403+
},
404+
})
405+
406+
expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true)
407+
})
408+
409+
it('should upload svg files', async () => {
410+
const expectedPath = path.join(dirname, './with-any-image-type')
411+
412+
const svgFilePath = path.resolve(dirname, './svgWithXml.svg')
413+
const doc = await payload.create({
414+
collection: anyImagesSlug as CollectionSlug,
415+
data: {},
416+
filePath: svgFilePath,
417+
})
418+
expect(await fileExists(path.join(expectedPath, doc.filename))).toBe(true)
419+
expect(doc.mimeType).toEqual('image/svg+xml')
420+
})
388421
})
389422

390423
describe('update', () => {

test/uploads/shared.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ export const bulkUploadsSlug = 'bulk-uploads'
3939

4040
export const fileMimeTypeSlug = 'file-mime-type'
4141
export const svgOnlySlug = 'svg-only'
42+
export const anyImagesSlug = 'any-images'

0 commit comments

Comments
 (0)