JGuang

上传

Upload · Arco Design

交互预览
npm install @arco-design/web-react@2.66.18

上传 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是否选中文件后自动上传booleantrue-
directory文件夹上传boolean-2.11.0
disabled禁用boolean--
drag是否拖拽上传boolean--
imagePreview启用内置的图片预览,仅在 listType='picture-card' 时生效。(v2.41.0)boolean--
multiple文件多选boolean--
withCredentials上传请求是否携带 cookieboolean--
action上传接口地址string--
method上传请求的 http methodstringpost2.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上传时使用的 headersobject--
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 | CustomIconTypetrue-
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文件 urlstring-
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 等字段。