Skip to content

file ​

Файл из <input type="file"> или FormData: размер и тип.

Сигнатура ​

ts
function file(options?: { maxSize?: number; types?: string[] }, msg?: Message): Schema<File>

Параметры ​

ПараметрТипОписание
options.maxSizenumberМаксимальный размер в байтах: 2 * 1024 * 1024
options.typesstring[]MIME-типы, группы и расширения: ['image/*', 'application/pdf', '.docx']
msgMessageСвоё сообщение для всех ошибок файла

Коды ошибок ​

КодКогдаСообщение по умолчанию
requiredЗначение пустое, а поле обязательноRequired
fileНе файлMust be a file
fileSizeФайл больше maxSizeFile must be at most {max}
fileTypeТип не из спискаFile type must be one of: {types}

Тексты можно поменять: см. Сообщения и локализация.

Особенности ​

  • Работает в браузере и в Node 20+ — там File приходит из FormData (request.formData() в fetch, Hono, Nuxt).
  • В сообщении {max} — размер в читаемом виде: 2 MB. В params ошибки есть и size — размер файла.
  • Расширения сравниваются без учёта регистра: .pdf пропустит DOC.PDF.
  • Несколько файлов — array с maxLength.

Примеры ​

Аватар ​

ts
const avatar = file({ maxSize: 2 * 1024 * 1024, types: ['image/*'] });

Несколько документов ​

ts
const Application = object({
  documents: pipe(array(file({ types: ['application/pdf', '.docx'] })), minLength(1), maxLength(5)),
});

На сервере ​

ts
app.post('/upload', async (c) => {
  const form = Object.fromEntries(await c.req.formData());
  const { avatar } = parse(object({ avatar: file({ maxSize: 2 * 1024 * 1024 }) }), form);
});

См. также ​