是的 /w Formik 文件上传验证

Yup /w Formik File Upload Validation

我将 Yup 与 Formik 一起使用,我 运行 遇到了问题,我需要验证我的文件上传。验证有效,但我遇到了问题,因为没有文件我无法提交表单。我需要将其设置为 notRequired,因为 initialValue 未定义,所以它会测试未定义的值。

我的代码:

    attachment: Yup.mixed()
        .nullable()
        .notRequired()
        .test("FILE_SIZE", "Uploaded file is too big.", value => value && value.size <= FILE_SIZE)
        .test("FILE_FORMAT", "Uploaded file has unsupported format.", value => value && SUPPORTED_FORMATS.includes(value.type))

这里的问题是两个 .test 使它无效。

value => value && value.size <= FILE_SIZEvalue => value && SUPPORTED_FORMATS.includes(value.type) 每次 valueundefinednull 时都会失败,但它不应该因您所说的而失败。

所以你需要做一些检查。如果 valuenullundefined,它是有效的,但如果不是,则进行其他检查。

所以你需要的是

attachment: Yup.mixed()
    .nullable()
    .notRequired()
    .test("FILE_SIZE", "Uploaded file is too big.", 
        value => !value || (value && value.size <= FILE_SIZE))
    .test("FILE_FORMAT", "Uploaded file has unsupported format.", 
        value => !value || (value && SUPPORTED_FORMATS.includes(value.type)))

您可以使用 'useRef' 来访问文件大小。

import React, { useRef } from 'react'
import { Field, ErrorMessage, useFormik, Formik, Form } from 'formik'

    const filesharhe_ref = useRef()
        const validationSchema = Yup.object({
                myfile: Yup.mixed().test('FILE_SIZE', "Uploaded file is too big."
                ,(value) => {
                   return(
                    value && filesharhe_ref.current ?
                        (filesharhe_ref.current.files[0].size<=FILE_SIZE? true: false)
                         : true)
                }),
            })
    
    <!-- Component-->

    <Field innerRef={filesharhe_ref} type="file" name="myfile" />
    <ErrorMessage name='myfile'  />

别忘了定义 FILE_SIZE.

您还可以检查文件格式:

Yup.mixed().test('FILE_SIZE', "Uploaded file is too big."
                ,(value) => {
                   return(
                    value && filesharhe_ref.current ?
                        (filesharhe_ref.current.files[0].size<=FILE_SIZE? true: false)
                         : true)
                }).test(
                'FILE_Type', "Not valid!"
                , (value) => {
                    console.log(filesharhe_ref.current.files[0])
                    return (
                        value && filesharhe_ref.current ?
                            (SUPPORTED_FORMATS.includes(filesharhe_ref.current.files[0].type) ? true : false)
                            : true)
                }
            )