antd中使用Form控件和Upload控件对图片上传并进行验证

本文详细介绍了如何在React应用中使用Ant Design的Upload组件进行图片上传,并通过Form表单进行有效的数据验证。文章展示了如何利用Form组件的getFieldDecorator方法实现上传图片的必填校验,同时提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行form提交时需要对Upload控件进行校验,若没有上传图片则进行校验,提示:请上传图片;否则,不进行校验。
使用Form控件绑定Upload上传控件,使用form的api:getFieldDecorator进行数据的双向绑定,并使用rules规则校验。

Upload控件详解

import React, { PureComponent } from 'react';
import { Row, Col, Form, Upload, Modal } from 'antd';
import { connect } from 'dva';
import { local } from '@/utils/utils';
const token = local.fetch('token');
const FormItem = Form.Item;

@connect(state => {
  return {
    list: state.list
  };
})
@Form.create()
export default class Contract extends PureComponent {
	state = {
	    previewVisible: false,
	    fileList: [],
	    previewImage: ''
	};
	handlePreviewImg = file => {
		this.setState({
			previewImage: file.url || file.thumbUrl,
			previewVisible: true,
		});
	};
	handleCancelImg = () => {
		this.setState({ previewVisible: false });
	}
	render() {
		const {
			visible,
			form: { getFieldDecorator, setFieldsValue }
		} = this.props;
		const {
			previewImage,
			fileList,
			previewVisible
		} = this.state;

		const propsUploadType = {
			name: 'files',                //发到后台的文件参数名
			action: '/oraflfile/upload',  //上传的地址
			accept: '.png,.jpg,.jpeg',	  //接受上传的文件类型
			method: 'post',               //上传请求的 http method,默认post
			listType: 'picture-card',     //上传列表的内建样式
			headers: {                    //设置上传的请求头部,IE10 以上有效
				Authorization: `Bearer ${token}`,
			},
			data: {},          //上传所需额外参数或返回上传额外参数的方法
			onChange(info){    //上传文件改变时的状态
				const { 
					file,     //当前操作的文件对象。
				 	fileList, //当前的文件列表
				 	even      //上传中的服务端响应内容,包含了上传进度等信息,高级浏览器支持
				 } = info;
				this.setState({ fileList }, () => {
					this.setState({ fileList: [...this.state.fileList] });
				});
				if (file.status === 'done') {
					message.success(`${file.name}文件上传成功`);
					setFieldsValue({ 'uploadImage': file.name });  //设置上传一张图片后就不进行校验
				}
				if (file.status === 'error') {
					message.error(`${file.name}文件上传失败`);
				}
			}
		};
		const uploadButton = (
			<div>
				<Icon type='plus' />
				<div>上传</div>
			</div>
		);
		return (
			<Form hideRequiredMark labelAlign='right'>
				<Row gutter={{ md: 4, lg: 12, xl: 24 }}>
					<Col md={24} sm={24}>
						<FormItem label={'上传图片'}>
							{getFieldDecorator('uploadImage', {
								rules: [
									{
										required: true,
										message: '请上传图片'
									}
								]
							})(
								<>
									<Upload
										{...propsUploadType}
										fileList={fileList}                //已经上传的文件列表(受控)
										onPreview={this.handlePreviewImg}  //点击文件链接或预览图标时的回调
									>
										{fileList.length > 2 ? null : uploadButton}
									</Upload>
									<Modal
										visible={previewVisible}
										footer={null}
										onCancel={this.handleCancelImg}
									>
										<img alt='example' style={{ width: '100%' }} src={previewImage} />
									</Modal>
								</>
							)}
						</FormItem>
					</Col>
				</Row>
			</Form>
		)
	}
}
在Ant Design的Form使用Upload组件通常涉及以下几个步骤: 1. 引入组件:首先,在你的项目里导入`antd`库中的`Form`、`Upload`以及相关的样式文件。 ```jsx import { Form, Upload } from 'antd'; ``` 2. 创建Upload组件:在表单的某个字段上创建`Upload`组件,配置其基本属性。例如,你可以设置上传限制、上传状态展示等。 ```jsx <FormItem label="上传文件"> <Upload name="file" action="/api/upload" // 你需要替换为你实际的上传地址 listType="text" // 可选值有'text', 'drag' multiple={false} // 是否支持多文件上传,默认为false beforeUpload={file => this.beforeUpload(file)} // 文件上传前的处理函数 onChange={info => this.handleChange(info)} // 上传进度或成功后的回调 onPreview={url => this.handlePreview(url)} // 文件预览事件 > {this.renderButton()} // 自定义按钮,比如点击后显示选择文件的弹窗 </Upload> </FormItem> ``` 3. 定义方法:创建对应的生命周期方法处理函数,如`beforeUpload`检查上传条件,`handleChange`更新状态,`handlePreview`处理预览等。 4. 表单提交:记得将`Upload`组件关联到`Form`的`getFieldDecorator`方法,这样表单提交时会同时提交文件。 ```jsx const { getFieldDecorator } = Form; ... <Form.Item> {getFieldDecorator('file', { initialValue: fileValue, // 如果已存在文件,则初始化为该值 })(<Upload ... />)} </Form.Item> ``` 5. 表单验证:如果需要对上传文件验证,可以在`rules`属性中添加相关规则。 ```jsx <Form.Item rules={[{ required: true, message: '请选择文件' }]}> {/* ... */} </Form.Item> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值