跳到主要内容

Upload 上传

  • 组件说明:拖拽上传区域,内置文件上传能力,管理文件队列的进度、状态与操作。
  • 组件组:Atomic
  • 实现约定:纯 Design 层组件,无 ui/ primitive。支持 action / customRequest / beforeUpload 上传生命周期(类似 antd Upload API)。
  • Figma 规范Upload Drags (21244:1609)

基础用法

空状态拖拽区域 — 点击或拖拽选择文件。提供 actioncustomRequest 即可启用自动上传。

结果
Loading...
实时编辑器
const Demo = () => {
  const [fileList, setFileList] = React.useState([]);
  return (
    <div style={{ maxWidth: 660 }}>
      <Upload
        hint="点击或拖拽音频文件上传"
        accept="audio/*,video/*"
        fileList={fileList}
        onChange={({ fileList: newList }) => setFileList(newList)}
      />
    </div>
  );
};
render(<Demo />);

文件队列

选择文件后,拖拽区域收缩为紧凑模式,下方显示文件列表。

结果
Loading...
实时编辑器
const Demo = () => {
  const [fileList, setFileList] = React.useState([
    { uid: '1', name: '想法与方案', size: 5600000, status: 'uploading', percent: 57 },
    { uid: '2', name: '02_22 下午会议 4月22日', size: 12400000, status: 'error' },
    { uid: '3', name: '0820 下午会议', size: 3700000, status: 'done' },
  ]);
  return (
    <div style={{ maxWidth: 660 }}>
      <Upload
        hint="或拖拽音频文件上传"
        description={
          <>
            最大文件时长:<strong>5 小时</strong>
            <br />
            支持 audio/*、video/*、.rmvb、.rm、.divx、.ts、.m2ts、.3gp、.f4v、.asr
          </>
        }
        fileList={fileList}
        onChange={({ fileList: newList }) => setFileList(newList)}
      />
    </div>
  );
};
render(<Demo />);

自动上传

提供 action(URL)或 customRequest 可在选择文件后自动上传。

结果
Loading...
实时编辑器
const Demo = () => {
  const [fileList, setFileList] = React.useState([]);
  return (
    <div style={{ maxWidth: 660 }}>
      <Upload
        hint="点击或拖拽音频文件上传"
        action="https://httpbin.org/post"
        fileList={fileList}
        onChange={({ file, fileList: newList }) => {
          setFileList(newList);
        }}
      />
    </div>
  );
};
render(<Demo />);

禁用状态

结果
Loading...
实时编辑器
render(
  <div style={{ maxWidth: 660 }}>
    <Upload hint="点击或拖拽音频文件上传" disabled />
  </div>,
)

自定义图标

通过 icon prop 替换默认云图标,传 null 可隐藏图标。

结果
Loading...
实时编辑器
render(
  <div style={{ maxWidth: 660 }}>
    <Upload icon={<span style={{ fontSize: 48 }}>📁</span>} hint="拖拽文件到此处" />
  </div>,
)

beforeUpload 校验

使用 beforeUpload 在上传前校验或转换文件,返回 false 可阻止上传。

结果
Loading...
实时编辑器
const Demo = () => {
  const [fileList, setFileList] = React.useState([]);
  return (
    <div style={{ maxWidth: 660 }}>
      <Upload
        hint="仅允许 10MB 以下文件"
        fileList={fileList}
        beforeUpload={(file) => {
          if (file.size > 10 * 1024 * 1024) {
            alert('文件过大!');
            return false;
          }
          return true;
        }}
        onChange={({ fileList: newList }) => setFileList(newList)}
      />
    </div>
  );
};
render(<Demo />);

尺寸 Token

Token用途
--Radius_55pxDropzone / FileItem 圆角
--Spacing_44px文件列表间距、状态图标间距
--Spacing_88pxFileItem 内边距、元信息间距
--Spacing_1616pxDropzone 与文件列表间距
--Spacing_2424px内容与操作按钮间距

颜色 Token

Token用途
--Labels-Secondary#3d3d3d文件名、提示文案
--Labels-Tertiary#757575文件大小、状态文案
--Labels-Link#0066cc紧凑模式 "Click" 链接色
--Grays-Gray_1#ebebeb拖拽悬停背景
--Grays-Gray_2#d6d6d6进度条轨道
--Grays-Gray_7#333333进度条指示器
--Status-Destructive#ff503f失败状态图标

Props

属性类型默认值说明
fileListUploadFile[]受控文件列表
defaultFileListUploadFile[][]非受控默认文件列表
actionstring | ((file: File) => Promise<string>)上传地址
customRequest(option: UploadRequestOption) => { abort }自定义上传请求
headersRecord<string, string>自定义请求头
dataRecord | ((file) => Record)附加上传数据
namestring'file'文件字段名
methodstring'POST'HTTP 方法
withCredentialsboolean是否携带 cookie
acceptstring文件输入 accept 属性
multiplebooleantrue允许多文件选择
maxCountnumber最大文件数量
beforeUpload(file, fileList) => boolean | File | Promise上传前校验;返回 false 阻止
onChange(info: { file, fileList }) => void状态变化回调
onRemove(file) => boolean | Promise<boolean>移除回调;返回 false 阻止
onDrop(e: DragEvent) => void拖拽放下回调
hintReactNode'Click or drag files to upload'拖拽区域提示文案
iconReactNodeCloudUploadIcon拖拽区域图标;传 null 隐藏
descriptionReactNode补充描述(格式、限制等)
disabledbooleanfalse禁用交互
classNamestring额外 class

UploadFile

字段类型说明
uidstring唯一标识
namestring文件名
sizenumber文件大小(字节)
status'uploading' | 'error' | 'done'上传状态
percentnumber上传进度(0–100)
responseunknown服务端响应
originFileFile原始 File 对象