云盘自动上传code

上传效果图

自动上传核心代码

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;