payloadcms/payload · error · FileUploadError

There was a problem while uploading the file.

Error message

There was a problem while uploading the file.

What it means

The large image-processing block in `generateFileData` (Sharp init, resize/format/trim, dimension probing, animated-GIF/WebP/AVIF handling, cropping, `createImageSizes`, focal point) is wrapped in a single `try`. **Any** error inside — Sharp failure, corrupt image, OOM, unsupported format, write error — is logged via `req.payload.logger.error(err)` and re-thrown as a generic `FileUploadError` (HTTP 400). The original error is only in the logs, not in the thrown message.

Source

Thrown at packages/payload/src/uploads/generateFileData.ts:421

            },
        file: fileForResize,
        focalPoint,
        mimeType: fileData.mimeType,
        req,
        savedFilename: fsSafeName || file.name,
        sharp,
        staticPath: staticPath!,
        withMetadata,
      })

      fileData.sizes = sizeData
      fileData.focalX = focalPoint?.x
      fileData.focalY = focalPoint?.y
      filesToSave.push(...sizesToSave)
    }
  } catch (err) {
    req.payload.logger.error(err)
    throw new FileUploadError(req.t)
  }

  newData = {
    ...newData,
    ...fileData,
    ...(draft ? { _status: 'draft' } : {}),
  }

  return {
    data: newData,
    files: filesToSave,
  }
}

/**
 * Parse upload edits from req or incoming data
 */
function parseUploadEditsFromReqOrIncomingData(args: {

View on GitHub (pinned to 00c58b35c0)

Solutions

  1. Inspect the Payload server logs — the original error (Sharp message, ENOSPC, etc.) is logged just before the generic throw.
  2. If Sharp is the culprit: ensure `sharp` is installed as a production dependency and built for the target architecture; in Next.js, keep the default Sharp integration.
  3. Validate the file's true type with `file-type` before upload and reject mismatches.
  4. Reduce `imageSizes` count or image dimensions to stay under memory limits; process large images in a queue/worker.
  5. Free disk space on the volume backing `staticDir`.

Example fix

// before — no pre-check; corrupt image hits the Sharp block
await payload.create({ collection: 'media', file: { data, mimetype, name, size } })

// after — sniff the real type and reject early
import { fileTypeFromBuffer } from 'file-type'
const type = await fileTypeFromBuffer(data)
if (!type || !type.mime.startsWith('image/')) {
  throw new Error('File is not a valid image')
}
await payload.create({ collection: 'media', file: { data, mimetype: type.mime, name, size } })
Defensive patterns

Strategy: try-catch

Validate before calling

import { fileTypeFromBuffer } from 'file-type'

async function isProcessableImage(data: Buffer): Promise<boolean> {
  const type = await fileTypeFromBuffer(data).catch(() => null)
  return !!type && type.mime.startsWith('image/')
}

if (sharpEnabled && !(await isProcessableImage(file.data))) {
  throw new Error('File is not a processable image')
}

Type guard

import { APIError } from 'payload'
function isFileUploadError(err: unknown): err is InstanceType<typeof APIError> {
  return err instanceof Error && /problem while uploading the file/i.test(err.message)
}

Try / catch

try {
  await payload.create({ collection: 'media', file })
} catch (err) {
  if (isFileUploadError(err)) {
    // original cause is in req.payload.logger output — check server logs
    // then: reject the file, re-install sharp, free disk, or reduce imageSizes
  } else throw err
}

Prevention

When it happens

Trigger: Creating/updating an upload collection document whose file is a corrupt, truncated, or unsupported image; a Sharp version mismatch (native bindings, libvips missing); animated-image decode failure; disk full when writing sizes; a crop/resize option referencing an unavailable Sharp feature.

Common situations: `sharp` was not installed/built for the deploy target (missing libvips, ARM/x86 mismatch, Next.js bundling Sharp out). The uploaded image is a renamed non-image (extension mismatch). A truncated upload (network drop) produces an invalid buffer. `imageSizes`/`resizeOptions` reference a format Sharp cannot encode. Container ran out of memory on a large image.

Related errors


AI-assisted analysis of payloadcms/payload@00c58b35c0 (2026-08-12). Data as JSON: /api/errors/8d1ff8e7118ad6c2. Report an issue: GitHub.