technological-brain-admin/src/api/upload.ts

154 lines
4.2 KiB
TypeScript
Raw Normal View History

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)
}
/**
* WordExcelPDF
* @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 })
}