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)