Minio批量上传文件(记录)

​​​​​​

  1. 批量处理优化

    • 使用 Promise.all 并行处理文件读取和上传
    • 添加了专门的batchUploadToMinio 函数处理批量上传
    • 移除了之前的分批处理逻辑,改为一次性并行上传所有文件
    • 基于文件大小计算总体上传进度,而不是简单的文件数量
    • 进度条显示更准确的整体上传进度

页面引入插件

import { initMinio, putObject } from 'minio-js'

// 组件挂载时初始化MinIO

onMounted(() => {

  initMinioClient();

});

/**

 * 处理文件上传

 * @param event 上传事件

 */

async function changeFile(event: any) {

  if (isUploading.value) {

    ElMessage.warning('有文件正在上传中,请等待完成');

    return;

  }

  const files = Array.from(event.target.files || []);

  if (files.length === 0) return;

  isUploading.value = true;

  const Forward = 'image/';

  try {

    // 批量读取所有文件内容

    const fileDataPromises = files.map(file => ({

      file,

      name: file.webkitRelativePath || file.name,

      size: file.size,

      dataPromise: readFileAsArrayBuffer(file)

    }));

    // 读取所有文件内容

    const fileData = await Promise.all(fileDataPromises.map(async item => {

      const content = await item.dataPromise;

      return {

        content,

        path: Forward + item.name,

        size: item.size,

        name: item.name

      };

    }));

    // 批量上传到MinIO

    await batchUploadToMinio('src', fileData, progressRef);

    // 批量更新服务器状态

    await Promise.all(fileData.map(item =>

      pushUplaodnews(getFileTypeNumber(fileType), item.name, item.size.toString())

    ));

    ElMessage.success(`所有文件上传完成! 共 ${files.length} 个文件`);

  } catch (error) {

    console.error('批量上传失败:', error);

    ElMessage.error('批量上传失败: ' + (error.message || '未知错误'));

  } finally {

    resetProgress();

    isUploading.value = false;

   

    // 清空文件输入框的值,确保下次可以选择相同文件

    event.target.value = '';

  }

}

/**

 * 读取文件为ArrayBuffer

 */

function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {

  return new Promise((resolve, reject) => {

    const reader = new FileReader();

    reader.onload = (e) => resolve(e.target?.result as ArrayBuffer);

    reader.onerror = (e) => reject(new Error('文件读取失败'));

    reader.readAsArrayBuffer(file);

  });

}

/**

 * 上传文件到MinIO

 */

function uploadToMinio(bucket: string, content: any, path: string): Promise<void> {

  return new Promise((resolve, reject) => {

    putObject(bucket, content, path, (err) => {

      if (err) reject(err);

      else resolve();

    });

  });

}

/**

 * 批量上传文件到MinIO并显示总体进度

 * @param bucket MinIO桶名称

 * @param files 文件对象数组,包含内容和路径

 * @param progressRef 进度条引用

 */

async function batchUploadToMinio(bucket: string, files: Array<{content: any, path: string, size: number}>, progressRef: any): Promise<void> {

  const totalSize = files.reduce((acc, file) => acc + file.size, 0);

  let uploadedSize = 0;

  // 使用Promise.all并行上传多个文件

  const uploadPromises = files.map(async (file, index) => {

    try {

      await uploadToMinio(bucket, file.content, file.path);

     

      // 更新总进度

      uploadedSize += file.size;

      progressRef.value = Math.round((uploadedSize / totalSize) * 100);

     

      return { success: true, path: file.path };

    } catch (error) {

      console.error(`上传失败: ${file.path}`, error);

      return { success: false, path: file.path, error };

    }

  });

  return Promise.all(uploadPromises).then(() => {});

}

最后注意上传组件ID重复使用问题,可能导致第二次上传失败的问题

  1. 修复了ID重复问题

    • 为每个文件输入框分配了唯一的ID,如imageFileInputposFileInputcameraFileInput 等
    • 确保每个 label 的 for 属性与对应的输入框ID匹配
<?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="ResumeDB" connectionString="Data Source=192.168.1.240;Initial Catalog=ResumeImport;User ID=ResumeImport;Password=ResumeImport2012" providerName="System.Data.SqlClient" /> <!--<add name="ResumeDB" connectionString="Server=DEV2-PC\RICHARD;Database=Resume;Trusted_Connection=True;" />--> </connectionStrings> <appSettings> <!--导入数据源 DB表示是去数据库取数 Directory表示直接从文件夹下导入 Excel表示数据源为Excel--> <add key="ImportSource" value="Directory"/> <!--<add key="UserName" value="baza_TZDZ"/> <add key="PWD" value="12a6eafd1a616e11ce51e419ab1435"/>--> <add key="UserName" value="baza_SZSQHD"/> <add key="PWD" value="52f6eafd9a616e94cd10e419db7818"/> <!--文件大小限制 单位KB--> <add key="LimitSize" value="2000"/> <!--支持上传文件类型--> <!--<add key="PermitImportFileExtension" value="doc,pdf,txt,html,htm"/>--> <add key="PermitImportFileExtension" value="doc,pdf,txt,html,htm,mht"/> <!--简历的渠道 1:招聘网站,2:猎头招聘,3:员工推荐,4:现场招聘,5:校园招聘,6:媒体广告,7:官网,8:企业人才库,9:其它, 10131:领导推荐,10132:外包,10133:培训机构,10254:职酷 如果不填或填0,则默认使用企业人才库--> <add key="Channel" value="0"/> <!--以下是数据源为Directory的参数 begin--> <add key="FileDirectory" value="F:\中国人才热线下载简历"/> <add key="CurrentlyFilePath" value=""/> <!--以上是数据源为Directory的参数 end--> <!--编码格式 int型 65001为UTF-8 936为默认--> <add key="CodePage" value="936"/> <!--以下是数据源为DB的参数 begin--> <add key="ServiceAddress" value=""/> <add key="TempDirectory" value="d:\ResumeTemp"/> <add key="FileStartID" value="0"/> <add key="FileIDName" value="ReportID"/> <add key="FileDataName" value="WordContent"/> <add key="FileTypeName" value="docname"/> <add key="GetResumeSql" value="select top 50 {0},WordContent,docname from ResumeDocReportTable where {0} > {1} order by {0} "/> <add key="WaitTime" value="10"/> <!--是否保存文件,0表示不保存,1表示保存导入错误的文件,2都保存--> <add key="SaveFile" value="1"/> <add key="FileExtension" value="doc"/> <!--以上是数据源为DB的参数 end--> <!--以下是数据源为Excel的参数 begin--> <add key="ExcelFileDirectory" value="C:\Documents and Settings\kiki\桌面\简历导入工具"/> <add key="ExcelToTxtTemplate" value="C:\Documents and Settings\kiki\桌面\简历导入工具\Template\ExcelToTxtTemplate.txt"/> <add key="ExcelRowKey" value="姓名"/> <add key="ExistKeyCount" value="3"/> <add key="CurrentlyExcelFilePath" value=""/> <!--以上是数据源为Excel的参数 end--> </appSettings> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_IResumeImport" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="6553600" maxBufferPoolSize="52428800" maxReceivedMessageSize="6553600" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> <readerQuotas maxDepth="3200" maxStringContentLength="819200" maxArrayLength="1638400" maxBytesPerRead="409600" maxNameTableCharCount="1638400" /> <security mode="None"> <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> <message clientCredentialType="UserName" algorithmSuite="Default" /> </security> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://115.29.222.109:8008/Baza.Hirede.Services.ResumeImport.ResumeImportService.svc/ResumeImport" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IResumeImport" contract="ResumeImportService.IResumeImport" name="BasicHttpBinding_IResumeImport" /> </client> </system.serviceModel> </configuration> <!--http://weixun.hirede.com/Baza.Hirede.Services.ResumeImport.ResumeImportService.svc/ResumeImport--> <!--http://localhost:8410/ResumeImport--> <!--http://resumeimport.hirede.com/Baza.Hirede.Services.ResumeImport.ResumeImportService.svc-->
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值