154 lines
4.2 KiB
TypeScript
154 lines
4.2 KiB
TypeScript
import service from './request'
|
||
import { ResponseData } from './request'
|
||
|
||
// 上传响应数据
|
||
export interface UploadResponse {
|
||
url: string // 文件访问地址
|
||
fileName: string // 文件名
|
||
fileSize: number // 文件大小(字节)
|
||
fileType: string // 文件类型
|
||
}
|
||
|
||
/**
|
||
* 上传文件到阿里云 OSS
|
||
* @param file 文件对象
|
||
* @param onProgress 上传进度回调
|
||
* @returns Promise<ResponseData<UploadResponse>>
|
||
*/
|
||
export function uploadFile(
|
||
file: File,
|
||
onProgress?: (progressEvent: any) => void
|
||
): Promise<ResponseData<UploadResponse>> {
|
||
const formData = new FormData()
|
||
formData.append('file', file)
|
||
|
||
return service.post('/oss/upload', formData, {
|
||
headers: {
|
||
'Content-Type': 'multipart/form-data'
|
||
},
|
||
onUploadProgress: onProgress
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 批量上传文件
|
||
* @param files 文件数组
|
||
* @param onProgress 上传进度回调
|
||
* @returns Promise<ResponseData<UploadResponse[]>>
|
||
*/
|
||
export function uploadFiles(
|
||
files: File[],
|
||
onProgress?: (progressEvent: any) => void
|
||
): Promise<ResponseData<UploadResponse[]>> {
|
||
const formData = new FormData()
|
||
files.forEach((file) => {
|
||
formData.append('files', file)
|
||
})
|
||
|
||
return service.post('/oss/upload/batch', formData, {
|
||
headers: {
|
||
'Content-Type': 'multipart/form-data'
|
||
},
|
||
onUploadProgress: onProgress
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 上传图片(带图片压缩和格式验证)
|
||
* @param file 图片文件
|
||
* @param options 配置选项
|
||
* @returns Promise<ResponseData<UploadResponse>>
|
||
*/
|
||
export interface UploadImageOptions {
|
||
maxSize?: number // 最大文件大小(MB),默认 5MB
|
||
allowedTypes?: string[] // 允许的文件类型,默认 ['image/jpeg', 'image/png', 'image/gif', 'image/webp']
|
||
onProgress?: (progressEvent: any) => void
|
||
}
|
||
|
||
export function uploadImage(
|
||
file: File,
|
||
options: UploadImageOptions = {}
|
||
): Promise<ResponseData<UploadResponse>> {
|
||
const {
|
||
maxSize = 5,
|
||
allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'],
|
||
onProgress
|
||
} = options
|
||
|
||
// 验证文件类型
|
||
if (!allowedTypes.includes(file.type)) {
|
||
return Promise.reject(new Error(`只支持上传 ${allowedTypes.join(', ')} 格式的图片`))
|
||
}
|
||
|
||
// 验证文件大小
|
||
const maxSizeBytes = maxSize * 1024 * 1024
|
||
if (file.size > maxSizeBytes) {
|
||
return Promise.reject(new Error(`图片大小不能超过 ${maxSize}MB`))
|
||
}
|
||
|
||
return uploadFile(file, onProgress)
|
||
}
|
||
|
||
/**
|
||
* 上传文档(Word、Excel、PDF 等)
|
||
* @param file 文档文件
|
||
* @param options 配置选项
|
||
* @returns Promise<ResponseData<UploadResponse>>
|
||
*/
|
||
export interface UploadDocumentOptions {
|
||
maxSize?: number // 最大文件大小(MB),默认 10MB
|
||
allowedTypes?: string[] // 允许的文件类型
|
||
onProgress?: (progressEvent: any) => void
|
||
}
|
||
|
||
export function uploadDocument(
|
||
file: File,
|
||
options: UploadDocumentOptions = {}
|
||
): Promise<ResponseData<UploadResponse>> {
|
||
const {
|
||
maxSize = 10,
|
||
allowedTypes = [
|
||
'application/pdf',
|
||
'application/msword',
|
||
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||
'application/vnd.ms-excel',
|
||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||
'application/vnd.ms-powerpoint',
|
||
'application/vnd.openxmlformats-officedocument.presentationml.presentation'
|
||
],
|
||
onProgress
|
||
} = options
|
||
|
||
// 验证文件类型
|
||
if (!allowedTypes.includes(file.type)) {
|
||
return Promise.reject(new Error('不支持的文档格式'))
|
||
}
|
||
|
||
// 验证文件大小
|
||
const maxSizeBytes = maxSize * 1024 * 1024
|
||
if (file.size > maxSizeBytes) {
|
||
return Promise.reject(new Error(`文档大小不能超过 ${maxSize}MB`))
|
||
}
|
||
|
||
return uploadFile(file, onProgress)
|
||
}
|
||
|
||
/**
|
||
* 删除文件
|
||
* @param url 文件地址
|
||
* @returns Promise<ResponseData<void>>
|
||
*/
|
||
export function deleteFile(url: string): Promise<ResponseData<void>> {
|
||
return service.post('/oss/delete', { url })
|
||
}
|
||
|
||
/**
|
||
* 获取文件临时访问地址(用于私有文件)
|
||
* @param url 文件地址
|
||
* @param expires 过期时间(秒),默认 3600
|
||
* @returns Promise<ResponseData<{ url: string }>>
|
||
*/
|
||
export function getFileUrl(url: string, expires = 3600): Promise<ResponseData<{ url: string }>> {
|
||
return service.post('/oss/getUrl', { url, expires })
|
||
}
|