reactjs 是(Y)表单文件上载确认

zrfyljdw  于 2023-02-18  发布在  React
关注(0)|答案(3)|浏览(141)

我在使用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))
r6l8ljro

r6l8ljro1#

这里的问题是两个.test使它无效。
每次valueundefinednull时,value => value && value.size <= FILE_SIZEvalue => value && SUPPORTED_FORMATS.includes(value.type)都将失败,但不应按您所说的那样失败。
所以你需要做一些检查,如果valuenull或者undefined,那么它是有效的,但是如果不是,做其他的检查。
所以你需要的是

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)))
rdlzhqv9

rdlzhqv92#

您可以使用“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)
                }
            )
zzzyeukh

zzzyeukh3#

attachedFile: Yup.mixed().test(
    "fileType",
    "Unsupported File Format",
    (value) => {
      if (value) {
        return (
          value.type === "image/jpeg" ||
          value.type === "image/jpg" ||
          value.type === "image/png" ||
          value.type === "application/pdf"
        );
      } else {
        return true;
      }
    }
  ),

相关问题