file
Файл из <input type="file"> или FormData: размер и тип.
Сигнатура
ts
function file(options?: { maxSize?: number; types?: string[] }, msg?: Message): Schema<File>Параметры
| Параметр | Тип | Описание |
|---|---|---|
options.maxSize | number | Максимальный размер в байтах: 2 * 1024 * 1024 |
options.types | string[] | MIME-типы, группы и расширения: ['image/*', 'application/pdf', '.docx'] |
msg | Message | Своё сообщение для всех ошибок файла |
Коды ошибок
| Код | Когда | Сообщение по умолчанию |
|---|---|---|
required | Значение пустое, а поле обязательно | Required |
file | Не файл | Must be a file |
fileSize | Файл больше maxSize | File 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);
});