Для работы с файлами в Ant Design используется
компонент Upload. Он предоставляет гибкий интерфейс для
загрузки файлов как на стороне клиента, так и на сервер. Подключение
компонента осуществляется следующим образом:
import { Upload, Button, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
Компонент Upload поддерживает несколько режимов
загрузки:
Простейший пример дискретной загрузки:
<Upload
name="file"
action="/upload.do"
onCha nge={(info) => {
if (info.file.status === 'done') {
message.success(`${info.file.name} успешно загружен`);
} else if (info.file.status === 'error') {
message.error(`${info.file.name} не удалось загрузить`);
}
}}
>
<Button icon={<UploadOutlined />}>Загрузить файл</Button>
</Upload>
Uploadaction – URL, куда будут отправляться
файлы.name – имя поля файла при отправке на
сервер.multiple – разрешает выбор нескольких
файлов.accept – фильтр по типам файлов,
например "image/*".beforeUpload – функция, вызываемая
перед загрузкой, может блокировать загрузку или изменять файл.onChange – обработчик событий
загрузки, возвращает объект info с состоянием файла.fileList – массив файлов,
контролируемый состоянием компонента.Использование beforeUpload позволяет проверять размер и
тип файла:
const beforeUpload = (file) => {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) {
message.error('Можно загружать только JPG или PNG');
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
message.error('Файл должен быть меньше 2MB');
}
return isJpgOrPng && isLt2M;
};
<Upload
name="file"
action="/upload.do"
beforeUpload={beforeUpload}
>
<Button icon={<UploadOutlined />}>Загрузить изображение</Button>
</Upload>
Ant Design предоставляет компонент Dragger, который
расширяет Upload для удобного Drag & Drop
интерфейса:
import { Upload } from 'antd';
const { Dragger } = Upload;
<Dragger
name="file"
action="/upload.do"
multiple
onCha nge={(info) => {
const { status } = info.file;
if (status === 'done') {
message.success(`${info.file.name} загружен успешно`);
} else if (status === 'error') {
message.error(`${info.file.name} загрузить не удалось`);
}
}}
>
<p className="ant-upload-drag-icon">
<UploadOutlined />
</p>
<p className="ant-upload-text">Перетащите файл сюда или нажмите для выбора</p>
<p className="ant-upload-hint">Поддерживаются несколько файлов одновременно</p>
</Dragger>
Состояние загруженных файлов можно контролировать через
fileList:
const [fileList, setFileList] = React.useState([]);
<Upload
action="/upload.do"
fileList={fileList}
onCha nge={({ fileList: newFileList }) => setFileList(newFileList)}
>
<Button icon={<UploadOutlined />}>Загрузить файлы</Button>
</Upload>
Такой подход позволяет:
Свойство progress позволяет
кастомизировать индикатор загрузки:
<Upload
action="/upload.do"
showUploadList={{ showRemoveIcon: true }}
progress={{ strokeColor: { '0%': '#108ee9', '100%': '#87d068' }, strokeWidth: 3, format: percent => `${parseFloat(percent.toFixed(2))}%` }}
>
<Button icon={<UploadOutlined />}>Загрузить с прогрессом</Button>
</Upload>
fetch или axiosДля большей гибкости можно отключить автоматическую загрузку и отправлять файлы вручную:
const customRequest = ({ file, onSuccess, onError }) => {
const formData = new FormData();
formData.append('file', file);
axios.post('/upload', formData)
.then(() => onSuccess('ok'))
.catch(() => onError('Ошибка загрузки'));
};
<Upload customRequest={customRequest}>
<Button icon={<UploadOutlined />}>Загрузить файл вручную</Button>
</Upload>
Для изображений Ant Design предоставляет возможность предварительного
просмотра с помощью метода previewFile и события
onPreview:
<Upload
listType="picture-card"
action="/upload.do"
onPrev iew={async file => {
const src = file.url || await getBase64(file.originFileObj);
const imageWindow = window.open(src);
imageWindow.document.write(`<img src="${src}" />`);
}}
>
<div>
<UploadOutlined />
<div style={{ marginTop: 8 }}>Загрузить</div>
</div>
</Upload>
Вспомогательная функция для преобразования файла в Base64:
const getBase64 = (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onl oad = () => resolve(reader.result);
reader.oner ror = error => reject(error);
});
};
Ant Design позволяет комбинировать проверки beforeUpload
с accept для строгого контроля типов и размеров файлов.
Например:
accept="application/pdf"accept="image/*"beforeUpload.fileList
для динамического управления состоянием.onChange и message для
отображения статусов загрузки.customRequest).listType="picture-card" для удобного визуального
представления.Ant Design предоставляет полный набор инструментов для гибкой загрузки файлов, управления их списком и визуального контроля процесса, что позволяет создавать интерфейсы на уровне профессиональных веб-приложений.