This commit is contained in:
lcw
2025-09-07 23:50:16 +08:00
parent 232f7b7860
commit 00b2c8bf16
37 changed files with 7283 additions and 333 deletions

View File

@ -0,0 +1,300 @@
import request from '@/utils/request';
import service from '@/utils/request';
import { upImageFileInfo } from '@/api/commit.js';
import { ElMessage } from 'element-plus';
// 上传单个文件
export async function uploadSingleFile(file, options = {}) {
try {
// 获取文件对象,确保能够正确访问文件信息
const fileObj = file.file || file;
// 创建临时文件对象用于显示
const tempFile = {
id: `temp_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
originalName: fileObj.name,
uploading: true
};
if (options.uploadedFiles) {
options.uploadedFiles.push(tempFile);
}
const isImageFile = fileObj.type.startsWith('image/');
// 只有图片文件才压缩
let fileData = isImageFile && options.compressImage ? await options.compressImage(fileObj) : fileObj;
const data = new FormData();
data.append("file", fileData);
// 更新UI状态
if (file.status !== undefined) {
file.status = "uploading";
file.message = "上传中...";
}
const res = await upImageFileInfo(data);
// 更新文件状态
if (options.uploadedFiles) {
const fileIndex = options.uploadedFiles.findIndex(f => f.id === tempFile.id);
if (fileIndex !== -1) {
options.uploadedFiles[fileIndex] = {
id: res.id || tempFile.id,
originalName: fileObj.name,
uploading: false,
url: res.url,
fileSize: fileObj.size
};
// 更新文件ID列表
if (options.fjIds) {
options.fjIds.push(res);
}
}
}
// 更新文件状态
if (file.status !== undefined) {
file.status = "done";
file.message = "上传成功";
file.id = res.id || tempFile.id;
file.url = res.url;
file.originalName = fileObj.name;
file.fileSize = fileObj.size;
}
ElMessage.success('文件上传成功');
return res;
} catch (error) {
console.error('文件上传失败:', error);
ElMessage.error('文件上传失败');
// 更新文件状态
if (file && file.status !== undefined) {
file.status = "failed";
file.message = "上传失败";
}
// 获取可能的文件名用于查找
const fileName = (file.file?.originalName || file.originalName || '');
// 移除上传失败的文件
if (options.uploadedFiles) {
const fileIndex = options.uploadedFiles.findIndex(f =>
f.originalName === fileName && f.uploading
);
if (fileIndex !== -1) {
options.uploadedFiles.splice(fileIndex, 1);
}
}
throw error;
}
}
// 上传多个文件
export async function uploadMultipleFiles(files, options = {}) {
if (Array.isArray(files)) {
// 多个文件上传
const results = [];
for (const file of files) {
try {
const result = await uploadSingleFile(file, options);
results.push(result);
} catch (error) {
// 可以选择继续上传其他文件或者中断
if (!options.continueOnError) {
throw error;
}
}
}
return results;
} else {
// 单个文件上传
return [await uploadSingleFile(files, options)];
}
}
// Element Plus 的 el-upload 上传函数
// export function upImageFileInfo(data) {
// return service({
// url: '/mosty-api/mosty-base/minio/file/uploadObj',
// method: 'post',
// data
// });
// }
// 文件下载函数
export function downloadFile(fileUrl, fileName = '') {
return new Promise((resolve, reject) => {
const token = localStorage.getItem('token');
const xhr = new XMLHttpRequest();
xhr.open('GET', fileUrl, true);
xhr.setRequestHeader('Authorization', token);
xhr.responseType = 'blob';
xhr.onload = function () {
if (this.status === 200) {
const blob = this.response;
const link = document.createElement('a');
const url = window.URL.createObjectURL(blob);
link.href = url;
link.download = fileName || 'download';
document.body.appendChild(link);
link.click();
// 清理
setTimeout(() => {
document.body.removeChild(link);
window.URL.revokeObjectURL(url);
}, 0);
resolve({ success: true });
} else {
ElMessage.error('文件下载失败');
reject(new Error('下载失败'));
}
};
xhr.onerror = function () {
ElMessage.error('网络错误,下载失败');
reject(new Error('网络错误'));
};
xhr.send();
});
}
// 删除文件前确认
export function beforeDelete(file) {
return new Promise((resolve) => {
// 创建一个简单的确认对话框
const confirmed = window.confirm(`确定要删除文件"${file.originalName || file.name}"吗?`);
resolve(confirmed);
});
}
// 删除文件
export async function deleteFile(file, options = {}) {
try {
// 显示确认对话框
const confirm = await beforeDelete(file);
if (confirm) {
const fileId = file.id;
const url = options.url || '/mosty-api/mosty-base/minio/file/delete';
const token = localStorage.getItem('token');
// 调用删除API
const res = await request({
url: url,
method: 'post',
data: { fileId },
headers: {
'Authorization': token
}
});
if (res.code === 10000 || res.status === 200) {
// 从已上传文件列表中移除
if (options.uploadedFiles) {
const fileIndex = options.uploadedFiles.findIndex(f =>
f.id === file.id || f.originalName === file.originalName
);
if (fileIndex !== -1) {
options.uploadedFiles.splice(fileIndex, 1);
}
}
// 从fileList中移除
if (options.fileList) {
const listIndex = options.fileList.findIndex(f => f.id === file.id);
if (listIndex !== -1) {
options.fileList.splice(listIndex, 1);
}
}
// 从fjIds中移除
if (options.fjIds) {
const fjIndex = options.fjIds.findIndex(f => f.id === file.id);
if (fjIndex !== -1) {
options.fjIds.splice(fjIndex, 1);
}
}
ElMessage.success('文件删除成功');
return res;
} else {
ElMessage.error('文件删除失败');
throw new Error('删除失败');
}
}
} catch (error) {
console.error('文件删除失败:', error);
ElMessage.error('文件删除失败');
throw error;
}
}
// 格式化文件大小
export function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
// el-upload 组件配置生成器
export function generateUploadConfig(options = {}) {
const {
limit = 3,
accept = '',
action = '/mosty-api/mosty-base/minio/image/upload/id',
onSuccess = () => { },
onRemove = () => { },
onExceed = () => { },
beforeRemove = () => { },
beforeUpload = () => { }
} = options;
// 获取token
const getToken = () => {
return localStorage.getItem('token');
};
return {
headers: {
'Authorization': getToken()
},
action: action,
multiple: true,
limit: limit,
accept: accept,
showFileList: true,
onSuccess: (response, uploadFile, uploadFiles) => {
ElMessage.success('上传成功');
onSuccess(response, uploadFile, uploadFiles);
},
onRemove: (uploadFile, uploadFiles) => {
onRemove(uploadFile, uploadFiles);
},
onExceed: (files, uploadFiles) => {
ElMessage.warning(`最多只能上传 ${limit} 个文件`);
onExceed(files, uploadFiles);
},
beforeRemove: (uploadFile, uploadFiles) => {
const result = beforeRemove(uploadFile, uploadFiles);
if (result === undefined) {
return window.confirm(`确定移除 ${uploadFile.name}`);
}
return result;
},
beforeUpload: (file) => {
return beforeUpload(file);
}
};
}