lcw
This commit is contained in:
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user