import type { IRequestConfig } from '@cainiaofe/cn-ui-common'; import type { CnReadOnlyCommonProps } from '../../cn-read-only/index'; import type { CnRequestConfig } from 'cn-request'; import type { UploadRequestHeader, BeforeUploadFileType } from './request'; import type { CommonProps } from '../../../types'; import type { ICnOSSData } from './oss-data'; import type { ICnOSSUploadFile, ICnUploadFile } from './upload-file'; export interface CnUploadBaseProps extends CommonProps { /** * 接受上传的文件类型, 详见 [input accept Attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept) */ accept?: string; /** * 是否只拍照,不选择文件或图片 * user 为前置摄像头,environment 为后置摄像头 */ capture?: 'user' | 'environment'; /** * 支持上传整个文件夹([caniuse](https://caniuse.com/#feat=input-file-directory)) */ directory?: boolean; /** * 是否支持多选文件。开启后按住 ctrl 可选择多个文件 * @default false */ multiple?: boolean; /** * 只读状态 * @default false */ readOnly?: boolean; /** * readOnly 预览态配置 */ readOnlyProps?: Pick; /** * 是否禁用 * @default false */ disabled?: boolean; /** * 上传限制数量 * @default 999 */ limit?: number; /** * 获取OSS上传凭证请求配置或请求方法 * @deprecated 请使用requestConfig (since version 0.10.20) */ service?: | (CnRequestConfig & { formatResult?: (data: unknown) => Promise | ICnOSSData; }) | ((params: { file: File }) => Promise | ICnOSSData); /** * 获取OSS上传凭证请求配置或请求方法 */ requestConfig?: IRequestConfig; /** * 上传文件配置 */ ossUploadConfig?: { /** * 上传文件是否携带 cookie */ withCredentials?: boolean; }; /** * 上传到阿里云 OSS Bucket 使用的请求头 * 如需设置获取凭证请求头请使用 requestConfig.headers */ headers?: UploadRequestHeader; /** * 点击打开文件对话框 * @default true */ openFileDialogOnClick?: boolean; /** * 文件列表 */ value?: ICnOSSUploadFile[]; /** * 非受控模式下默认值文件列表 */ defaultValue?: ICnOSSUploadFile[]; /** * 上传文件之前的钩子,参数为上传的文件,若返回 `false` 则停止上传。 * 支持返回一个 Promise 对象,Promise 对象 reject 时则停止上传 * resolve时开始上传,resolve传入`File`或`Blob`对象则上传resolve传入的对象 */ beforeUpload?: ( file: File, fileList: File[], ) => BeforeUploadFileType | Promise; /** * 只包含已上传完成的文件,只在上传完成和文件删除时触发 * 上传过程中的进度可通过 onProgress api 获取 * * @param value 文件列表 * @param currentFile 当一次选择多个文件批量上传时,由于上传对象是数组,此时 currentFile 为空,建议业务不要强依赖 */ onChange?: ( value: ICnOSSUploadFile[], currentFile?: ICnOSSUploadFile, ) => void; /** * 上传进度回调 * @param file 正常上传的文件 */ onProgress?: (file: ICnUploadFile) => void; /** * 上传失败后的回调,组件默认会通过提示告知用户失败原因 * 如果用户希望业务处理并阻止组件内部处理时,可以通过返回 false 来阻止 */ onError?: (error: Error, file: ICnUploadFile) => false | unknown; /** * 是否开启删除 * @default true */ showRemove?: ((file: ICnOSSUploadFile) => boolean) | boolean; /** * 点击删除文件时触发执行回调 * 满足以下条件不移除文件,其他场景会删除文件 * 1. 返回值为 false * 2. Promise.resolve(false) * 3. Promise.reject(new Error()) */ onRemove?: ( file: ICnUploadFile, ) => Promise | false | unknown; /** * 是否开启预览 * @default true */ showPreview?: ((file: ICnOSSUploadFile) => boolean) | boolean; /** * 自定义预览逻辑 */ onPreview?: (file: ICnOSSUploadFile) => void; /** * 是否开启下载 * @default true */ showDownload?: ((file: ICnOSSUploadFile) => boolean) | boolean; /** * 自定义下载逻辑 * @default (file) => {if (file.downloadUrl || file.url) { window.open(file.downloadUrl || file.url); }} */ onDownload?: (file: ICnOSSUploadFile) => void; }