J'ai un formulaire utilisant reactjs + formik + yup. J'ai un champ de téléchargement de fichiers multiples. Je veux valider le format de fichier et la taille maximale en utilisant yup. Comment puis-je faire cela?
3 Réponses :
Manipulez-le vous-même - vous n'êtes pas très doué pour valider les fichiers que j'ai trouvés.
Quelque chose comme:
<Formik onSubmit={(values) => { // submission stuff }} initialValues={{ file1: undefined, file2: undefined }} validate={(values) => { const errors = {}; if (values.file1 !== undefined) { if (values.file1.type !== 'text/plain' errors.file1 = 'Only .txt files allowed.'; } if (values.file1.size > 1024 * 16) { errors.file1 = 'File too large.'; } } else { errors.file1 = 'File is required.'; } if (values.file2 == undefined) { if (values.file2.type !== 'image/jpeg' errors.file2 = 'Only .jpg images allowed.'; } if (values.file2.size > 1024 * 16) { errors.file2 = 'File too large.'; } } else { errors.file2 = 'File is required.'; } return errors; }} >
En développant la réponse de Devin , vous pouvez mettre en œuvre cette validation avec yup.
export function checkIfFilesAreTooBig(files?: [File]): boolean { let valid = true if (files) { files.map(file => { const size = file.size / 1024 / 1024 if (size > 10) { valid = false } }) } return valid } export function checkIfFilesAreCorrectType(files?: [File]): boolean { let valid = true if (files) { files.map(file => { if (!['application/pdf', 'image/jpeg', 'image/png'].includes(file.type)) { valid = false } }) } return valid }
Où se trouvent les fonctions de validation:
const schema = Yup.object().shape({ files: Yup.array() .nullable() .required('VALIDATION_FIELD_REQUIRED') .test('is-correct-file', 'VALIDATION_FIELD_FILE_BIG', checkIfFilesAreTooBig) .test( 'is-big-file', 'VALIDATION_FIELD_FILE_WRONG_TYPE', checkIfFilesAreCorrectType ), })
Ce code fonctionnera pour valider les formats d'image.
const SUPPORTED_FORMATS = ["image/jpg", "image/jpeg", "image/gif", "image/png"]; export const validateImageType = (value) => { if(value) { let type = value.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/)[0] return SUPPORTED_FORMATS.includes(type) } } Yup.mixed() .test('fileSize', "File is too large", value => value.size <= FILE_SIZE) .test('fileType', "Your Error Message", value => SUPPORTED_FORMATS.includes(value.type) )
Vous pouvez l'ajouter pour la validation de la taille Yup.mixed (). Test ('fileSize', "File Size is too large", value => value.size <= FILE_SIZE)