上传效果图

自动上传核心代码
import { FileModule } from '@/store/module/file';
import { FolderModule } from '@/store/module/folder';
import { message } from 'ant-design-vue';
import { File, Response } from 'type/index';
import { mapSeries } from 'async';
// import { events } from 'util/event'
const sameNameOperation = File.SameNameOpt.SAVEALL;
const AutoUpload = async (
batchCode: string,
isFolder: boolean,
): Promise<string> => {
// 立即上传当前批次
FileModule.updateUploadingBatchId(batchCode);
try {
const checkResult: Response.ChecSourceResponse =
await FileModule.uploadCheck();
// if (checkResult.hasSameNameSource) {
// 1.刷新当前文件夹(parentFolderId)的资源
// 2. 记录重名数组nameRepetition[batchid] ,暂停当前批次,传下个批次
// 3.询问用户是否取消或者保留两者
// } else {
// 上传文件/文件夹
if (!isFolder) {
try {
// 1.更新当前batch状态为上传中
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.uploading,
});
// 2..获取分片信息
const { targetBatch } = FileModule;
if (targetBatch) {
const { parentFolderId, rootFile } = targetBatch;
if (!rootFile) {
return Promise.resolve('');
}
const { name: fileName, size: contentLength, file } = rootFile;
const params: File.UploadFileParams = {
parentFolderId,
fileName,
batchCode,
file,
contentLength,
sameNameOperation,
};
const filePartsMapId = await FileModule.fetchFilePartsInfo(params);
// 3. 开始上传文件
await FileModule.uploadFileParts(filePartsMapId);
// 4. 更新当前batch状态为已上传
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.success,
});
// 5. 将上传中的状态改为非上传中
FileModule.updateUploadingBatchId('');
return Promise.resolve(parentFolderId);
} else {
return Promise.reject('文件找不到');
}
} catch (err) {
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.fail,
});
// 抛错,也要修改上传状态,以便于下个批次上传
FileModule.updateUploadingBatchId('');
return Promise.reject('文件自动上传函数抛错' + err);
}
} else {
// 遍历fileList
// 1.新建一个文件夹
// 2.拿到新文件夹id,将文件一个个上传到改文件夹里
// 3.如果当前的资源是文件,重复1、2步
try {
// 1.更新当前batch状态为上传中
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.uploading,
});
const { targetBatch } = FileModule;
if (targetBatch) {
const { parentFolderId, rootFile } = targetBatch;
if (!rootFile) {
return Promise.resolve(parentFolderId);
}
const { fileList, name } = rootFile;
const folderName = name.substring(0, 41); // 文件名最多40
// 新建一个文件夹
const newFolder = await FolderModule.addNewFolder({
batchCode,
parentSourceId: parentFolderId,
folderName,
autoRename: 1,
});
const { sourceId: pid } = newFolder;
await mapSeries(fileList, async (item: File.FileType, cb: any) => {
await traverseFolder(batchCode, pid, item);
cb();
});
// 4. 更新当前batch状态为已上传
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.success,
});
FileModule.updateUploadingBatchId('');
return Promise.resolve(parentFolderId);
} else {
return Promise.reject('文件夹找不到');
}
} catch (err) {
// 这里拦不到traverseFolder的错误
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.fail,
});
FileModule.updateUploadingBatchId('');
return Promise.reject('文件夹上传函数抛错' + err);
}
}
// }
} catch (err) {
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.fail,
});
FileModule.updateUploadingBatchId('');
return Promise.reject('文件校验失败');
}
};
async function traverseFolder(
batchCode: string,
parentFolderId: string,
source: File.FileType,
) {
const { isFolder, name, file, size: contentLength, fileList } = source;
const folderName = name.substring(0, 41); // 文件名最多40
if (isFolder) {
// 1.新建一个文件夹
try {
const newFolder = await FolderModule.addNewFolder({
batchCode,
parentSourceId: parentFolderId,
folderName,
autoRename: 1,
});
// 2.拿到新文件夹id
const { sourceId: pid } = newFolder;
return mapSeries(fileList, async (item: File.FileType, cb: any) => {
await traverseFolder(batchCode, pid, item);
cb();
});
} catch {
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.uploadingAndError,
});
return Promise.resolve();
}
} else {
const params: File.UploadFileParams = {
parentFolderId,
fileName: name,
batchCode,
file,
contentLength,
sameNameOperation,
};
if (!contentLength) {
FileModule.updateBatchFileTotal(batchCode);
message.success('已经自动过滤空文件');
return Promise.resolve('');
}
try {
// 1. 获取分片信息
const filePartsMapId = await FileModule.fetchFilePartsInfo(params);
// 2. 上传文件
await FileModule.uploadFileParts(filePartsMapId);
FileModule.updataBatchCompleteAmount(batchCode);
return Promise.resolve('');
} catch {
// 这里可以拦截到每个文件错误---统计失败个数
// // 此时上传的文件夹已经成功被创建,如果有需要更新资源列表
// if (parentFolderId === FolderModule.selectedFolderId) {
// console.log('selectedFolderId', FolderModule.selectedFolderId)
// window.dispatchEvent(events.refreshTableSource)
// }
FileModule.updataBatchErrorAmount(batchCode);
FileModule.updateFilePool({
batchCode,
status: File.FileUploadStatus.uploadingAndError,
});
return Promise.resolve('');
}
}
}
export default AutoUpload;