tdesign-react
Version:
TDesign Component for React
453 lines (452 loc) • 18.5 kB
TypeScript
/**
* 该文件为脚本自动生成文件,请勿随意修改。如需修改请联系 PMC
* */
import { ImageViewerProps } from '../image-viewer';
import { UploadConfig } from '../config-provider/type';
import { ButtonProps } from '../button';
import { PlainObject, TNode, UploadDisplayDragEvents } from '../common';
import { CSSProperties, MouseEvent, DragEvent } from 'react';
import { ImageProps } from '../image';
export interface TdUploadProps<T extends UploadFile = UploadFile> {
/**
* 文件名过长时,需要省略中间的文本,保留首尾文本。示例:[10, 7],表示首尾分别保留的文本长度
*/
abridgeName?: Array<number>;
/**
* 接受上传的文件类型,[查看 W3C示例](https://www.w3schools.com/tags/att_input_accept.asp),[查看 MDN 示例](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file)
* @default ''
*/
accept?: string;
/**
* 上传接口。设接口响应数据为字段 `response`,那么 `response.error` 存在时会判断此次上传失败,并显示错误文本信息;`response.url` 会作为文件上传成功后的地址,并使用该地址显示图片或文件
* @default ''
*/
action?: string;
/**
* 是否允许重复上传相同文件名的文件
* @default false
*/
allowUploadDuplicateFile?: boolean;
/**
* 是否在选择文件后自动发起请求上传文件
* @default true
*/
autoUpload?: boolean;
/**
* 如果是自动上传模式 `autoUpload=true`,表示全部文件上传之前的钩子函数,函数参数为上传的文件,函数返回值决定是否继续上传,若返回值为 `false` 则终止上传。<br/>如果是非自动上传模式 `autoUpload=false`,则函数返回值为 `false` 时表示本次选中的文件不会加入到文件列表中,即不触发 `onChange` 事件
*/
beforeAllFilesUpload?: (file: UploadFile[]) => boolean | Promise<boolean>;
/**
* 如果是自动上传模式 `autoUpload=true`,表示单个文件上传之前的钩子函数,若函数返回值为 `false` 则表示不上传当前文件。<br/>如果是非自动上传模式 `autoUpload=false`,函数返回值为 `false` 时表示从上传文件中剔除当前文件
*/
beforeUpload?: (file: UploadFile) => boolean | Promise<boolean>;
/**
* 批量文件/图片上传,`autoUpload=false` 场景下,透传“取消上传”按钮属性
*/
cancelUploadButton?: null | ButtonProps | TNode<{
disabled: boolean;
cancelUploadText: string;
cancelUpload: (ctx: {
e: MouseEvent;
}) => void;
}>;
/**
* 非拖拽场景,指触发上传的元素,如:“选择文件”。如果是拖拽场景,则是指拖拽区域
*/
children?: TNode;
/**
* 上传请求所需的额外字段,默认字段有 `file`,表示文件信息。可以添加额外的文件名字段,如:`{file_name: "custom-file-name.txt"}`。`autoUpload=true` 时有效。也可以使用 `formatRequest` 完全自定义上传请求的字段
*/
data?: Record<string, any> | ((files: UploadFile[]) => Record<string, any>);
/**
* 是否禁用
*/
disabled?: boolean;
/**
* 用于自定义拖拽区域,`theme=custom` 且 `draggable=true` 时有效
*/
dragContent?: TNode | TNode<TriggerContext>;
/**
* 是否启用拖拽上传,不同的组件风格默认值不同。`theme=file` 或 `theme=image` 时有效
*/
draggable?: boolean;
/**
* 用于完全自定义文件列表界面内容(UI),单文件和多文件均有效
*/
fileListDisplay?: TNode<{
files: UploadFile[];
dragEvents?: UploadDisplayDragEvents;
}>;
/**
* 已上传文件列表,同 `value`。TS 类型:`UploadFile`
* @default []
*/
files?: Array<T>;
/**
* 已上传文件列表,同 `value`。TS 类型:`UploadFile`,非受控属性
* @default []
*/
defaultFiles?: Array<T>;
/**
* 转换文件 `UploadFile` 的数据结构,可新增或修改 `UploadFile` 的属性,注意不能删除 `UploadFile` 属性。`action` 存在时有效
*/
format?: (file: File) => UploadFile;
/**
* 用于新增或修改文件上传请求 参数。`action` 存在时有效。一个请求上传一个文件时,默认请求字段有 `file`。<br/>一个请求上传多个文件时,默认字段有 `file[0]/file[1]/file[2]/.../length`,其中 `length` 表示本次上传的文件数量。<br/>⚠️非常注意,此处的 `file[0]/file[1]` 仅仅是一个字段名,并非表示 `file` 是一个数组,接口获取字段时注意区分。<br/>可以使用 `name` 定义 `file` 字段的别名。<br/>也可以使用 `formatRequest` 自定义任意字段,如添加一个字段 `fileList` ,存储文件数组
*/
formatRequest?: (requestData: {
[key: string]: any;
}) => {
[key: string]: any;
};
/**
* 用于格式化文件上传后的接口响应数据,`response` 便是接口响应的原始数据。`action` 存在时有效。<br/> 示例返回值:`{ error, url, status, files }` <br/> 此函数的返回值 `error` 会作为错误文本提醒,表示上传失败的原因,如果存在会判定为本次上传失败。<br/> 此函数的返回值 `url` 会作为单个文件上传成功后的链接。<br/> `files` 表示一个请求同时上传多个文件后的文件列表
*/
formatResponse?: (response: any, context: FormatResponseContext) => ResponseType;
/**
* 设置上传的请求头部,`action` 存在时有效
*/
headers?: {
[key: string]: string;
};
/**
* 用于在上传图片场景下,透传属性配置至 Image 组件
*/
imageProps?: ImageProps;
/**
* 透传图片预览组件全部属性
*/
imageViewerProps?: ImageViewerProps;
/**
* 用于添加属性到 HTML 元素 `input`
*/
inputAttributes?: CSSProperties;
/**
* 多个文件是否作为一个独立文件包,整体替换,整体删除。不允许追加文件,只允许替换文件。`theme=file-flow` 时有效
* @default false
*/
isBatchUpload?: boolean;
/**
* 上传组件文本语言配置,支持自定义配置组件中的全部文本。优先级高于全局配置中语言
*/
locale?: UploadConfig;
/**
* 用于控制文件上传数量,值为 0 则不限制。注意,单文件上传场景,请勿设置 `max` 属性
* @default 0
*/
max?: number;
/**
* HTTP 请求类型
* @default POST
*/
method?: 'POST' | 'GET' | 'PUT' | 'OPTIONS' | 'PATCH' | 'post' | 'get' | 'put' | 'options' | 'patch';
/**
* 模拟进度间隔时间,单位:毫秒,默认:300。由于原始的上传请求,小文件上传进度只有 0 和 100,故而新增模拟进度,每间隔 `mockProgressDuration` 毫秒刷新一次模拟进度。小文件设置小一点,大文件设置大一点。注意:当 `useMockProgress` 为真时,当前设置有效
*/
mockProgressDuration?: number;
/**
* 支持多文件上传
* @default false
*/
multiple?: boolean;
/**
* 文件上传时的名称
* @default file
*/
name?: string;
/**
* 占位符
* @default ''
*/
placeholder?: string;
/**
* 自定义上传方法。返回值 `status` 表示上传成功或失败;`error` 或 `response.error` 表示上传失败的原因;<br/>`response` 表示请求上传成功后的返回数据,`response.url` 表示上传成功后的图片/文件地址,`response.files` 表示一个请求上传多个文件/图片后的返回值。<br/>示例一:`{ status: 'fail', error: '上传失败', response }`。<br/>示例二:`{ status: 'success', response: { url: 'https://tdesign.gtimg.com/site/avatar.jpg' } }`。<br/> 示例三:`{ status: 'success', files: [{ url: 'https://xxx.png', name: 'xxx.png' }]}`
*/
requestMethod?: (files: UploadFile | UploadFile[]) => Promise<RequestMethodResponse>;
/**
* 是否显示图片的文件名称
* @default true
*/
showImageFileName?: boolean;
/**
* 是否在文件列表中显示缩略图,`theme=file-flow` 时有效
* @default false
*/
showThumbnail?: boolean;
/**
* 是否显示上传进度
* @default true
*/
showUploadProgress?: boolean;
/**
* 图片文件大小限制,默认单位 KB。可选单位有:`'B' | 'KB' | 'MB' | 'GB'`。示例一:`1000`。示例二:`{ size: 2, unit: 'MB', message: '图片大小不超过 {sizeLimit} MB' }`
*/
sizeLimit?: number | SizeLimitObj;
/**
* 文件上传提示文本状态
*/
status?: 'default' | 'success' | 'warning' | 'error';
/**
* 组件风格。custom 表示完全自定义风格;file 表示默认文件上传风格;file-input 表示输入框形式的文件上传;file-flow 表示文件批量上传;image 表示默认图片上传风格;image-flow 表示图片批量上传
* @default file
*/
theme?: 'custom' | 'file' | 'file-input' | 'file-flow' | 'image' | 'image-flow';
/**
* 组件下方文本提示,可以使用 `status` 定义文本
*/
tips?: TNode;
/**
* 触发上传的元素,`files` 指本次显示的全部文件
*/
trigger?: TNode<TriggerContext>;
/**
* 透传选择按钮全部属性
*/
triggerButtonProps?: ButtonProps;
/**
* 是否在同一个请求中上传全部文件,默认一个请求上传一个文件。多文件上传时有效
* @default false
*/
uploadAllFilesInOneRequest?: boolean;
/**
* 批量文件/图片上传,`autoUpload=false` 场景下,透传“点击上传”按钮属性
*/
uploadButton?: null | ButtonProps | TNode<{
disabled: boolean;
uploading: boolean;
uploadFiles: () => void;
uploadText: string;
}>;
/**
* 是否允许粘贴上传剪贴板中的文件
* @default true
*/
uploadPastedFiles?: boolean;
/**
* 是否在请求时间超过 300ms 后显示模拟进度。上传进度有模拟进度和真实进度两种。一般大小的文件上传,真实的上传进度只有 0 和 100,不利于交互呈现,因此组件内置模拟上传进度。真实上传进度一般用于大文件上传。
* @default true
*/
useMockProgress?: boolean;
/**
* 上传请求时是否携带 cookie
* @default false
*/
withCredentials?: boolean;
/**
* 点击「取消上传」时触发
*/
onCancelUpload?: () => void;
/**
* 已上传文件列表发生变化时触发,`trigger` 表示触发本次的来源
*/
onChange?: (value: Array<T>, context: UploadChangeContext) => void;
/**
* 进入拖拽区域时触发
*/
onDragenter?: (context: {
e: DragEvent<HTMLDivElement>;
}) => void;
/**
* 离开拖拽区域时触发
*/
onDragleave?: (context: {
e: DragEvent<HTMLDivElement>;
}) => void;
/**
* 拖拽结束时触发
*/
onDrop?: (context: {
e: DragEvent<HTMLDivElement>;
}) => void;
/**
* 上传失败后触发。`response` 指接口响应结果,`response.error` 会作为错误文本提醒。如果希望判定为上传失败,但接口响应数据不包含 `error` 字段,可以使用 `formatResponse` 格式化 `response` 数据结构。如果是多文件多请求上传场景,请到事件 `onOneFileFail` 中查看 `response`
*/
onFail?: (options: UploadFailContext) => void;
/**
* 多文件/图片场景下,单个文件上传失败后触发,如果一个请求上传一个文件,则会触发多次。单文件/图片不会触发
*/
onOneFileFail?: (options: UploadFailContext) => void;
/**
* 单个文件上传成功后触发,在多文件场景下会触发多次。`context.file` 表示当前上传成功的单个文件,`context.response` 表示上传请求的返回数据
*/
onOneFileSuccess?: (context: Pick<SuccessContext, 'e' | 'file' | 'response' | 'XMLHttpRequest'>) => void;
/**
* 点击图片预览时触发,文件没有预览
*/
onPreview?: (options: {
file: UploadFile;
index: number;
e: MouseEvent<HTMLDivElement>;
}) => void;
/**
* 上传进度变化时触发,真实进度和模拟进度都会触发。<br/>⚠️ 原始上传请求,小文件的上传进度只有 0 和 100,故而不会触发 `progress` 事件;只有大文件才有真实的中间进度。如果你希望很小的文件也显示上传进度,保证 `useMockProgress=true` 的情况下,设置 `mockProgressDuration` 为更小的值。<br/>参数 `options.type=real` 表示真实上传进度,`options.type=mock` 表示模拟上传进度
*/
onProgress?: (options: ProgressContext) => void;
/**
* 移除文件时触发
*/
onRemove?: (context: UploadRemoveContext) => void;
/**
* 选择文件或图片之后,上传之前,触发该事件
*/
onSelectChange?: (files: File[], context: UploadSelectChangeContext) => void;
/**
* 上传成功后触发。<br/>`context.currentFiles` 表示当次请求上传的文件(无论成功或失败),`context.fileList` 表示上传成功后的文件,`context.response` 表示上传请求的返回数据。<br/>`context.results` 表示单次选择全部文件上传成功后的响应结果,可以在这个字段存在时提醒用户上传成功或失败。<br />
*/
onSuccess?: (context: SuccessContext) => void;
/**
* 文件上传校验结束事件,文件数量超出、文件大小超出限制、文件同名、`beforeAllFilesUpload` 返回值为假、`beforeUpload` 返回值为假等场景会触发。<br/>注意:如果设置允许上传同名文件,即 `allowUploadDuplicateFile=true`,则不会因为文件重名触发该事件。<br/>结合 `status` 和 `tips` 可以在组件中呈现不同类型的错误(或告警)提示
*/
onValidate?: (context: {
type: UploadValidateType;
files: UploadFile[];
}) => void;
/**
* 待上传文件列表发生变化时触发。`context.files` 表示事件参数为待上传文件,`context.trigger` 引起此次变化的触发来源
*/
onWaitingUploadFilesChange?: (context: {
files: Array<UploadFile>;
trigger: 'validate' | 'remove' | 'uploaded';
}) => void;
}
/** 组件实例方法 */
export interface UploadInstanceFunctions<T extends UploadFile = UploadFile> {
/**
* 组件实例方法,打开文件选择器
*/
triggerUpload: () => void;
/**
* 设置上传中文件的上传进度
*/
uploadFilePercent: (params: {
file: UploadFile;
percent: number;
}) => void;
/**
* 组件实例方法,默认上传未成功上传过的所有文件。带参数时,表示上传指定文件
*/
uploadFiles: (files?: UploadFile[]) => void;
}
export interface UploadFile extends PlainObject {
/**
* 上一次变更的时间
*/
lastModified?: number;
/**
* 文件名称
* @default ''
*/
name?: string;
/**
* 下载进度
*/
percent?: number;
/**
* 原始文件对象
*/
raw?: File;
/**
* 上传接口返回的数据。`response.error` 存在时会判断此次上传失败,并显示错误文本信息;`response.url` 会作为文件上传成功后的地址,并使用该地址显示图片
*/
response?: {
[key: string]: any;
};
/**
* 文件大小
*/
size?: number;
/**
* 文件上传状态:上传成功,上传失败,上传中,等待上传
* @default ''
*/
status?: 'success' | 'fail' | 'progress' | 'waiting';
/**
* 文件类型
* @default ''
*/
type?: string;
/**
* 上传时间
* @default ''
*/
uploadTime?: string;
/**
* 文件上传成功后的下载/访问地址
* @default ''
*/
url?: string;
}
export type ResponseType = {
error?: string;
url?: string;
status?: 'fail' | 'success';
files?: UploadFile[];
} & Record<string, any>;
export interface FormatResponseContext {
file: UploadFile;
currentFiles?: UploadFile[];
}
export interface RequestMethodResponse {
status: 'success' | 'fail';
error?: string;
response: {
url?: string;
files?: UploadFile[];
[key: string]: any;
};
}
export interface SizeLimitObj {
size: number;
unit: SizeUnit;
message?: string;
}
export type SizeUnitArray = ['B', 'KB', 'MB', 'GB'];
export type SizeUnit = SizeUnitArray[number];
export interface TriggerContext {
dragActive?: boolean;
files: UploadFile[];
}
export interface UploadChangeContext {
e?: MouseEvent<HTMLElement> | ProgressEvent;
response?: any;
trigger: UploadChangeTrigger;
index?: number;
file?: UploadFile;
files?: UploadFile[];
}
export type UploadChangeTrigger = 'add' | 'remove' | 'abort' | 'progress-success' | 'progress' | 'progress-fail' | 'default';
export interface UploadFailContext {
e?: ProgressEvent;
failedFiles: UploadFile[];
currentFiles: UploadFile[];
response?: any;
file: UploadFile;
XMLHttpRequest?: XMLHttpRequest;
}
export interface ProgressContext {
e?: ProgressEvent;
file?: UploadFile;
currentFiles: UploadFile[];
percent: number;
type: UploadProgressType;
XMLHttpRequest?: XMLHttpRequest;
}
export type UploadProgressType = 'real' | 'mock';
export interface UploadRemoveContext {
index?: number;
file?: UploadFile;
e: MouseEvent<HTMLElement>;
}
export interface UploadSelectChangeContext {
currentSelectedFiles: UploadFile[];
}
export interface SuccessContext {
e?: ProgressEvent;
file?: UploadFile;
fileList?: UploadFile[];
currentFiles?: UploadFile[];
response?: any;
results?: SuccessContext[];
XMLHttpRequest?: XMLHttpRequest;
}
export type UploadValidateType = 'FILE_OVER_SIZE_LIMIT' | 'FILES_OVER_LENGTH_LIMIT' | 'FILTER_FILE_SAME_NAME' | 'BEFORE_ALL_FILES_UPLOAD' | 'CUSTOM_BEFORE_UPLOAD';