上传 Upload
用户可传输文件或提交相应的内容。
安装
npm install @arco-design/web-react@2.66.18
在入口引入 @arco-design/web-react/dist/css/arco.css,用 ConfigProvider 设置语言。React 19 项目还需在入口最先引入 @arco-design/web-react/es/_util/react-19-adapter,否则 Message、Modal 等命令式 API 无法渲染。
示例
- 基础用法:最基础的上传组件用法。
- 用户头像上传:点击上传用户头像,可使用 beforeUpload 限制用户上传的图片格式和大小。
- 已上传的文件列表:默认的文件上传列表
- 照片墙:点击图片预览按钮时,可以
onPreview中进行预览逻辑。 可以通过imagePreview属性启用内置的图片预览。(imagePreview属性在2.41.0支持) - 拖拽上传:拖拽上传。当使用拖拽上传,且设置
accept时候,选择后的文件将会被根据后缀名及文件类型被过滤。不符合格式的文件将不会出现在上传列表。 - 图片列表样式:图片列表样式
- 手动上传:设置
autoUpload为false时候,可以通过调用submit方法进行手动上传。submit只会上传处于fileList中的文件。 - 上传前校验:
beforeUpload会在每一个文件上传之前执行。如果返回 false 或者 Promise.reject, 那么将会取消当前文件的上传。 - 上传前裁剪:
beforeUpload会在每一个文件上传之前执行。如果返回 false 或者 Promise.reject, 那么将会取消当前文件的上传。 - 移除前校验:
onRemove会在每个文件从上传列表中删除之前执行。如果返回 false 或者 Promise.reject,那么将会终止移除操作。 - 限制上传数量:通过
limit限制上传的最大数量。超出后上传按钮会隐藏. - 自定义上传节点:可以传入自定义内容作为文件上传的触发节点。
- 自定义图标:
showUploadList字段可以设置图标。 - 自定义文件上传列表展示:传入
renderUploadList可以自定义展示文件上传列表。第一个参数是当前上传列表,第二个参数是上传列表相关的属性。详细可参考<UploadListProps> - 自定义上传实现:默认通过 Ajax 请求上传,可以设置 customRequest 覆盖默认的上传请求,实现自定义上传。 返回值是一个对象,包含
abort用来终止上传。 - 自定义进度条:
progressProps字段可以自定义进度条属性。 - 文件夹上传:文件夹上传
示例来自 Arco Design 官方仓库(MIT),固定在 npm 2.66.18 对应的提交;部分示例使用在线图片或上传地址,预览中网络请求被禁用。
API
Upload
| 参数名 | 描述 | 类型 | 默认值 | 版本 |
|---|---|---|---|---|
| autoUpload | 是否选中文件后自动上传 | boolean | true | - |
| directory | 文件夹上传 | boolean | - | 2.11.0 |
| disabled | 禁用 | boolean | - | - |
| drag | 是否拖拽上传 | boolean | - | - |
| imagePreview | 启用内置的图片预览,仅在 listType='picture-card' 时生效。(v2.41.0) | boolean | - | - |
| multiple | 文件多选 | boolean | - | - |
| withCredentials | 上传请求是否携带 cookie | boolean | - | - |
| action | 上传接口地址 | string | - | - |
| method | 上传请求的 http method | string | post | 2.55.0 |
| listType | 展示类型 | 'text' | 'picture-list' | 'picture-card' | text | - |
| tip | 提示文字,listType 不同,展示会有区别 | string | React.ReactNode | - | - |
| accept | 接受上传的类型 详细请参考。(strict in 2.53.0,默认为 true。设置为 false 时,accept 表现和原生一致。设置为 true 时,会严格匹配文件后缀名,过滤掉不符合 accept 规则的文件。) | string | { type: string; strict?: boolean } | - | - |
| beforeUpload | 上传文件之前的回调。返回 false 或者 promise抛出异常的时候会取消上传。 | (file: File, filesList: File[]) => boolean | Promise<any> | () => true | - |
| className | 节点类名 | string | string[] | - | - |
| defaultFileList | 默认已上传的文件列表 | UploadItem[] | - | - |
| fileList | 已上传的文件列表 | UploadItem[] | - | - |
| headers | 上传时使用的 headers | object | - | - |
| limit | 限制上传数量。默认超出后会隐藏上传节点。对象类型在 2.28.0 支持 | number | { maxCount: number; hideOnExceedLimit?: boolean } | - | - |
| onRemove | 点击删除文件时的回调。返回 false 或者 Promise.reject 的时候不会执行删除。 | (file: UploadItem, fileList: UploadItem[]) => void | boolean | Promise<void | boolean> | - | - |
| progressProps | 进度条属性,接收所有进度条的 props。 | Partial<ProgressProps> | - | - |
| showUploadList | 是否展示上传文件列表。预览图标,删除图标,文件图标,重新上传图标,取消上传图标。 | boolean | CustomIconType | true | - |
| style | 节点样式 | CSSProperties | - | - |
| customRequest | 通过覆盖默认的上传行为,可以自定义自己的上传实现 | (options: RequestOptions) => UploadRequestReturn | void | - | - |
| data | 上传时的 Body 参数 | object | ((any: any) => object) | - | - |
| name | 发请求时文件内容的参数名 | string | ((any: any) => string) | - | - |
| onChange | 上传文件改变时的回调。文件开始上传,失败,成功时会触发。注意:如果需要实时获取文件的上传进度,请在 onProgress 中处理。 | (fileList: UploadItem[], file: UploadItem) => void | - | - |
| onDragLeave | 拖拽上传文件离开拖拽区时的回调 | (e: React.DragEvent) => void | - | 2.41.0 |
| onDragOver | 拖拽上传文件进入拖拽区时的回调 | (e: React.DragEvent) => void | - | 2.41.0 |
| onDrop | 拖拽上传文件时执行的回调 | (e: React.DragEvent) => void | - | 2.37.0 |
| onExceedLimit | 超出上传数量限制时触发 | (files: File[], fileList: UploadItem[]) => void | - | - |
| onPreview | 点击预览时候的回调 | (file: UploadItem) => void | - | - |
| onProgress | 文件上传进度的回调 | (file: UploadItem, e?: ProgressEvent) => void | - | - |
| onReupload | 文件重新上传时触发的回调 | (file: UploadItem) => void | - | - |
| renderUploadItem | 自定义上传列表项 | (originNode: ReactNode, file: UploadItem, fileList: UploadItem[]) => ReactNode | - | - |
| renderUploadList | 自定义展示上传文件列表 | (fileList: UploadItem[], uploadListProps: UploadListProps) => ReactNode | - | - |
UploadListProps
文件上传列表展示
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| disabled | 禁用 | boolean | - |
| onRemove | 点击删除文件时的回调。返回 false 或者 Promise.reject 的时候不会执行删除 | (file: UploadItem) => void | boolean | Promise<void | boolean> | - |
| onAbort | 中止文件上传的回调 | (file: UploadItem) => void | - |
| onPreview | 点击预览时候的回调。 | (file: UploadItem) => void | - |
| onReupload | 重新上传的回调 | (file: UploadItem) => void | - |
UploadItem
| 参数名 | 描述 | 类型 | 默认值 |
|---|---|---|---|
| percent | 上传进度百分比 | number | - |
| name | 文件名 | string | - |
| uid | 当前上传文件的唯一标示 | string (必填) | - |
| url | 文件 url | string | - |
| originFile | 文件对象 | File | - |
| response | 当前文件上传请求返回的响应 | object | - |
| status | 当前上传文件的状态 | UploadStatus | - |
RequestOptions
export type RequestOptions = Pick<
UploadProps,
"headers" | "name" | "data" | "withCredentials" | "action" | "method"
> & {
/** 更新当前文件的上传进度 。percent: 当前上传进度百分比 */
onProgress: (percent: number, event?: ProgressEvent) => void;
/** 上传成功后,调用onSuccess方法,传入的response参数将会附加到当前上传文件的reponse字段上 */
onSuccess: (response?: object) => void;
/** 上传失败后,调用onError方法,传入的 response 参数将会附加到当前上传文件的response字段 */
onError: (response?: object) => void;
/** 当前上传文件 */
file: File;
};
UploadRequestReturn
export interface UploadRequestReturn {
abort?: () => void;
[key: string]: any;
}
CustomIconType
export type CustomIconType = {
previewIcon?: ReactNode;
removeIcon?: ReactNode;
fileIcon?: ReactNode;
reuploadIcon?: ReactNode;
cancelIcon?: ReactNode;
startIcon?: ReactNode;
errorIcon?: ReactNode;
successIcon?: ReactNode;
fileName?: (file: UploadItem) => ReactNode;
// 2.34.0
progressRender?: (
file: UploadItem,
originDom: ReactNode
) => React.ReactElement;
// 2.34.0
imageRender?: (file: UploadItem) => React.ReactNode;
};
UploadStatus
export type UploadStatus = "init" | "uploading" | "done" | "error";
方法/Methods
| 参数名 | 描述 | 类型 |
|---|---|---|
| submit | 手动上传时,调用该方法,开始上传。示例。不传参数时,会默认上传全部init状态的文件。 | (file?: UploadItem) => void |
| abort | 中止文件上传 | (file: UploadItem) => void |
| reupload | 重新上传文件 | (file: UploadItem) => void |
// 自定义图标类型
type CustomIconType = {
previewIcon?: ReactNode;
removeIcon?: ReactNode;
fileIcon?: ReactNode;
reuploadIcon?: ReactNode;
cancelIcon?: ReactNode;
startIcon?: ReactNode;
errorIcon?: ReactNode;
fileName?: (file: UploadItem) => ReactNode;
progressRender?: (file: UploadItem, originDom: ReactNode) => ReactElement; // 2.34.0
imageRender?: (file: UploadItem) => ReactNode; // 2.34.0
}
常见问题
如何完全控制上传文件的状态和进度?
可以参考 示例 ,,建议设置 autoUpload为 false。并通过 fileList 和 onChange 使组件完全受控。
fileList 是UploadItem[],可以直接设置元素的 status,percent 等字段。