Skip to content

Commit 9a0568c

Browse files
authored
fix(payload): applies resize after cropping if resizeOptions are defined (#8528)
Fixes #7592
1 parent 829996a commit 9a0568c

File tree

2 files changed

+79
-15
lines changed

2 files changed

+79
-15
lines changed

packages/payload/src/uploads/generateFileData.ts

Lines changed: 50 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -236,23 +236,58 @@ export const generateFileData = async <T>({
236236
withMetadata,
237237
})
238238

239-
filesToSave.push({
240-
buffer: croppedImage,
241-
path: `${staticPath}/${fsSafeName}`,
242-
})
239+
// Apply resize after cropping to ensure it conforms to resizeOptions
240+
if (resizeOptions) {
241+
const resizedAfterCrop = await sharp(croppedImage)
242+
.resize({
243+
fit: resizeOptions?.fit || 'cover',
244+
height: resizeOptions?.height,
245+
position: resizeOptions?.position || 'center',
246+
width: resizeOptions?.width,
247+
})
248+
.toBuffer({ resolveWithObject: true })
249+
250+
filesToSave.push({
251+
buffer: resizedAfterCrop.data,
252+
path: `${staticPath}/${fsSafeName}`,
253+
})
243254

244-
fileForResize = {
245-
...file,
246-
data: croppedImage,
247-
size: info.size,
248-
}
249-
fileData.width = info.width
250-
fileData.height = info.height
251-
if (fileIsAnimatedType) {
252-
const metadata = await sharpFile.metadata()
253-
fileData.height = metadata.pages ? info.height / metadata.pages : info.height
255+
fileForResize = {
256+
...fileForResize,
257+
data: resizedAfterCrop.data,
258+
size: resizedAfterCrop.info.size,
259+
}
260+
261+
fileData.width = resizedAfterCrop.info.width
262+
fileData.height = resizedAfterCrop.info.height
263+
if (fileIsAnimatedType) {
264+
const metadata = await sharpFile.metadata()
265+
fileData.height = metadata.pages
266+
? resizedAfterCrop.info.height / metadata.pages
267+
: resizedAfterCrop.info.height
268+
}
269+
fileData.filesize = resizedAfterCrop.info.size
270+
} else {
271+
// If resizeOptions is not present, just save the cropped image
272+
filesToSave.push({
273+
buffer: croppedImage,
274+
path: `${staticPath}/${fsSafeName}`,
275+
})
276+
277+
fileForResize = {
278+
...file,
279+
data: croppedImage,
280+
size: info.size,
281+
}
282+
283+
fileData.width = info.width
284+
fileData.height = info.height
285+
if (fileIsAnimatedType) {
286+
const metadata = await sharpFile.metadata()
287+
fileData.height = metadata.pages ? info.height / metadata.pages : info.height
288+
}
289+
fileData.filesize = info.size
254290
}
255-
fileData.filesize = info.size
256291

257292
if (file.tempFilePath) {
258293
await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path

test/uploads/e2e.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,35 @@ describe('uploads', () => {
619619
// without focal point update this generated size was equal to 1736
620620
expect(redDoc.sizes.focalTest.filesize).toEqual(1598)
621621
})
622+
623+
test('should resize image after crop if resizeOptions defined', async () => {
624+
await page.goto(animatedTypeMediaURL.create)
625+
await page.waitForURL(animatedTypeMediaURL.create)
626+
627+
const fileChooserPromise = page.waitForEvent('filechooser')
628+
await page.getByText('Select a file').click()
629+
const fileChooser = await fileChooserPromise
630+
await wait(1000)
631+
await fileChooser.setFiles(path.join(dirname, 'test-image.jpg'))
632+
633+
await page.locator('.file-field__edit').click()
634+
635+
// set crop
636+
await page.locator('.edit-upload__input input[name="Width (px)"]').fill('400')
637+
await page.locator('.edit-upload__input input[name="Height (px)"]').fill('800')
638+
// set focal point
639+
await page.locator('.edit-upload__input input[name="X %"]').fill('75') // init left focal point
640+
await page.locator('.edit-upload__input input[name="Y %"]').fill('50') // init top focal point
641+
642+
await page.locator('button:has-text("Apply Changes")').click()
643+
await page.waitForSelector('button#action-save')
644+
await page.locator('button#action-save').click()
645+
await expect(page.locator('.payload-toast-container')).toContainText('successfully')
646+
await wait(1000) // Wait for the save
647+
648+
const resizeOptionMedia = page.locator('.file-meta .file-meta__size-type')
649+
await expect(resizeOptionMedia).toContainText('200x200')
650+
})
622651
})
623652

624653
test('should see upload previews in relation list if allowed in config', async () => {

0 commit comments

Comments
 (0)