Antd upload组件结合form上传文件及其他参数总结

Antd upload组件结合form上传文件及其他参数总结

前端:

form表单中:

<a-form :form="form" @submit="handleSubmit">
    <a-form-item
                 style="text-align: center"
                 :label="$t('form.basic-form.title.photo')"
                 :labelCol="{lg: {span: 7}, sm: {span: 7}}"
                 :wrapperCol="{lg: {span: 10}, sm: {span: 17} }"
                 >
        <Myupload @child-event="getPhotosFromChild" v-decorator="['file',{rules: [{required: true, message: '请务必上传至少一张图片'}]}]" ref="myupload"/>
    </a-form-item>
</a-form>

Myupload中:

<a-upload :headers="headers" :file-list="fileList" :remove="handleRemove" :before-upload="beforeUpload">
    <a-button> <a-icon type="upload" />上传图片</a-button>
</a-upload>

思路:图片上传至 Myupload 组件,Myupload 组件触发 beforeUpload 方法,将 fileList[](data中的)传给父组件 a-form-item

beforeUpload(file) {
    this.fileList = [...this.fileList, file]
    this.$emit('child-event',this.fileList)
    return false
},

回到 form 表单组件,收到子组件发来的 fileList (这里只上传一个图片),将其添加进 formData 中,此处 formData:

data () {
    return {
        form: this.$form.createForm(this),
        formData: new FormData()
    }
},

收到子组件传来的 fileList 后的回调

getPhotosFromChild(data) {
    this.formData.append('file',data[0])
    console.log('asdasd@@@file',this.formData.get('file'))
},

这里其他参数最终也会被 append 到 FormData 对象中,因为我的后端要接受的是 multipart/form-data 类型参数,而不是 application/json ,全都封装成 FormData 后,浏览器会直接将数据识别为 multipart/form-data 类型并发送给后端

后端:

直接接收一个 HttpServletRequest request 对象进行处理,获取前端的数据:

MultipartHttpServletRequest params = (MultipartHttpServletRequest) request;
MultipartFile file =  ((MultipartHttpServletRequest) request).getFile("file");

String goodsLabel = params.getParameter("goodsLabel");
String goodsDesc = params.getParameter("goodsDesc");
String goodsName = params.getParameter("goodsName");
String price = params.getParameter("price");

如果报错:

org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.Mult…

就改用:

MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());

MultipartHttpServletRequest params = resolver.resolveMultipart(request);

antd组件库的Upload组件上传文件后,如果还提示规则验证失败,可能是因为您设置了规则验证函数(rules)但是没有正确地处理上传文件的情况。您可以在规则验证函数中增加对上传文件的判断。例如,在上传图片时,您可以通过判断文件类型和文件大小来进行验证。具体的代码实现可以参考下面的示例: ```jsx <Form.Item name="avatar" label="Avatar" rules={[ { required: true, message: 'Please upload your avatar', }, ({ getFieldValue }) => ({ validator(_, file) { const maxSize = 2 * 1024 * 1024; // 2MB const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'; if (!isJPG) { return Promise.reject('You can only upload JPG/PNG file!'); } else if (file.size > maxSize) { return Promise.reject(`Image must smaller than ${maxSize / 1024 / 1024}MB!`); } else { return Promise.resolve(); } }, }), ]} valuePropName="fileList" getValueFromEvent={normFile} > <Upload name="avatar" action="/upload.do" listType="picture"> <Button icon={<UploadOutlined />}>Click to upload</Button> </Upload> </Form.Item> ``` 在这个示例中,我们设置了一个规则验证函数,它会验证上传的文件是否是JPG或PNG格式,以及文件大小是否小于2MB。如果验证失败,会返回一个Promise.reject(),提示错误信息。如果验证通过,会返回一个Promise.resolve(),表示验证成功。这样,在上传文件后,就会先进行规则验证,如果验证通过,才会提交表单数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值