--- order: 1 title: zh-CN: 用户头像 en-US: Avatar --- ## zh-CN 点击上传用户头像,并使用 `beforeUpload` 限制用户上传的图片格式和大小。 > `beforeUpload` 的返回值可以是一个 Promise 以支持异步处理,如服务端校验等:[示例](https://upload-react-component.vercel.app/demo/before-upload#beforeupload)。 ## en-US Click to upload user's avatar, and validate size and format of picture with `beforeUpload`. > The return value of function `beforeUpload` can be a Promise to check asynchronously. [demo](https://upload-react-component.vercel.app/demo/before-upload#beforeupload) ```tsx import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'; import { message, Upload } from 'antd'; import type { UploadChangeParam } from 'antd/es/upload'; import type { RcFile, UploadFile, UploadProps } from 'antd/es/upload/interface'; import React, { useState } from 'react'; const getBase64 = (img: RcFile, callback: (url: string) => void) => { const reader = new FileReader(); reader.addEventListener('load', () => callback(reader.result as string)); reader.readAsDataURL(img); }; const beforeUpload = (file: RcFile) => { const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; if (!isJpgOrPng) { message.error('You can only upload JPG/PNG file!'); } const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { message.error('Image must smaller than 2MB!'); } return isJpgOrPng && isLt2M; }; const App: React.FC = () => { const [loading, setLoading] = useState(false); const [imageUrl, setImageUrl] = useState(); const handleChange: UploadProps['onChange'] = (info: UploadChangeParam) => { if (info.file.status === 'uploading') { setLoading(true); return; } if (info.file.status === 'done') { // Get this url from response in real world. getBase64(info.file.originFileObj as RcFile, url => { setLoading(false); setImageUrl(url); }); } }; const uploadButton = (
{loading ? : }
Upload
); return ( {imageUrl ? avatar : uploadButton} ); }; export default App; ```