Files
hzdyjs/web/src/api/system/file.ts
T
2025-08-02 21:06:47 +08:00

162 lines
4.3 KiB
TypeScript

import request from '@/utils/request'
/**
* 获取文件临时访问URL
* @param ossId 文件ID
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 临时访问URL
*/
export function getFileAccessUrl(ossId: number, bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: `/resource/file/access/${ossId}`,
method: 'get',
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 批量获取文件临时访问URL
* @param ossIds 文件ID列表
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 文件ID与临时URL的映射
*/
export function getBatchFileAccessUrl(ossIds: number[], bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: '/resource/file/access/batch',
method: 'post',
data: ossIds,
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 获取文件下载URL(带权限检查)
* @param ossId 文件ID
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 下载URL
*/
export function getFileDownloadUrl(ossId: number, bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: `/resource/file/download/${ossId}`,
method: 'get',
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 获取文件预览URL(带权限检查)
* @param ossId 文件ID
* @param bucketPassword bucket访问密码
* @param expireSeconds 过期时间(秒),默认300秒
* @returns 预览URL
*/
export function getFilePreviewUrl(ossId: number, bucketPassword?: string, expireSeconds: number = 300) {
return request({
url: `/resource/file/preview/${ossId}`,
method: 'get',
params: {
bucketPassword,
expireSeconds
}
})
}
/**
* 安全下载文件(带bucket密码验证)
* @param ossId 文件ID
* @param fileName 文件名
* @param bucketPassword bucket访问密码
* @returns Promise<void>
*/
export async function secureDownloadFile(ossId: number, fileName: string, bucketPassword?: string) {
try {
// 获取临时下载URL
const { data: downloadUrl } = await getFileDownloadUrl(ossId, bucketPassword)
// 使用fetch下载文件
const response = await fetch(downloadUrl)
if (!response.ok) {
throw new Error('下载失败')
}
const blob = await response.blob()
// 创建下载链接
const url = URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = fileName
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
// 释放内存
URL.revokeObjectURL(url)
return Promise.resolve()
} catch (error) {
console.error('文件下载失败:', error)
return Promise.reject(error)
}
}
/**
* 安全预览文件(带bucket密码验证)
* @param ossId 文件ID
* @param contentType 文件类型
* @param bucketPassword bucket访问密码
* @returns Promise<string> 预览URL
*/
export async function securePreviewFile(ossId: number, contentType?: string, bucketPassword?: string) {
try {
// 获取临时预览URL
const { data: previewUrl } = await getFilePreviewUrl(ossId, bucketPassword)
// 根据文件类型选择预览方式
if (contentType?.startsWith('image/')) {
// 图片直接返回URL用于预览
return Promise.resolve(previewUrl)
} else {
// 其他文件在新窗口打开
window.open(previewUrl, '_blank')
return Promise.resolve(previewUrl)
}
} catch (error) {
console.error('文件预览失败:', error)
return Promise.reject(error)
}
}
/**
* 获取bucket访问密码提示
* @param bucketName bucket名称
* @returns 密码提示信息
*/
export function getBucketPasswordHint(bucketName: string) {
// 这里可以根据bucket名称返回相应的密码提示
// 例如:从配置中获取密码提示信息
return `请输入 ${bucketName} bucket 的访问密码`
}
/**
* 验证bucket密码格式
* @param password 密码
* @returns 验证结果
*/
export function validateBucketPassword(password: string): boolean {
// 简单的密码格式验证
return password && password.length >= 6
}