You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展JavaScript代码实现Azure Blob Storage多文件批量上传

如何扩展Azure Blob Storage单文件上传代码实现批量上传?

Hey there! 我之前也用过Gaurav Mantri的Azure Blob上传代码,要改成批量上传其实没那么复杂,我给你一步步拆解操作,就算JS经验不多也能跟着做:

1. 先改HTML的文件选择器

首先得让用户能一次选多个文件,把原来的单文件选择框改成支持多选的:

<input type="file" id="fileInput" multiple>

这样用户按住Ctrl(Windows)或Cmd(Mac)就能选多个文件了。

2. 调整JS获取文件的逻辑

原来的代码应该是取files[0](第一个选中的文件),现在要改成获取所有选中的文件数组:

const fileInput = document.getElementById('fileInput');
const selectedFiles = fileInput.files; // 这是一个FileList对象,包含所有选中的文件

3. 核心:循环处理每个文件上传

接下来要遍历所有选中的文件,对每个文件执行原来的上传逻辑。这里给你两种常用的上传方式,按需选择:

方式一:顺序上传(一个接一个传)

适合文件数量不多,或者需要保证上传顺序的场景,用async/await实现,逻辑更清晰:

// 批量上传入口函数
async function startBatchUpload() {
  const fileInput = document.getElementById('fileInput');
  const selectedFiles = fileInput.files;

  // 遍历每个文件,逐个上传
  for (const file of selectedFiles) {
    try {
      // 调用封装好的单文件上传函数
      await uploadSingleFileToBlob(file);
      console.log(`✅ 文件 ${file.name} 上传成功`);
      // 这里可以更新页面提示,比如给文件加个成功标记
    } catch (error) {
      console.error(`❌ 文件 ${file.name} 上传失败:`, error);
      // 页面提示上传失败
    }
  }
}

// 把原来Gaurav的单文件上传逻辑封装成异步函数
async function uploadSingleFileToBlob(file) {
  // 替换成你的Blob服务配置
  const blobService = AzureStorage.Blob.createBlobServiceWithSas('你的Blob存储URL', '你的SAS令牌');
  const containerName = '你的容器名';

  return new Promise((resolve, reject) => {
    blobService.createBlockBlobFromBrowserFile(containerName, file.name, file, {
      blockSize: 4 * 1024 * 1024, // 4MB分块大小,可根据需求调整
    }, (error, result) => {
      if (error) {
        reject(error);
      } else {
        resolve(result);
      }
    });
  });
}

方式二:并发上传(同时传多个)

如果文件数量多,想提高上传速度,可以用并发上传,但要注意控制并发数(避免浏览器或Azure限流),比如同时传3个:

async function startConcurrentUpload(maxConcurrency = 3) {
  const fileInput = document.getElementById('fileInput');
  // 把FileList转成普通数组,方便处理
  const selectedFiles = Array.from(fileInput.files);

  // 单个文件的上传处理函数
  async function processFile(file) {
    try {
      await uploadSingleFileToBlob(file);
      console.log(`✅ 文件 ${file.name} 上传成功`);
    } catch (error) {
      console.error(`❌ 文件 ${file.name} 上传失败:`, error);
    }
  }

  let activeUploads = [];
  for (const file of selectedFiles) {
    activeUploads.push(processFile(file));
    // 当并发数达到上限,等其中一个上传完成再继续
    if (activeUploads.length >= maxConcurrency) {
      await Promise.race(activeUploads);
      // 移除已经完成的上传任务
      activeUploads = activeUploads.filter(p => p.status !== 'fulfilled');
    }
  }
  // 等待所有剩余的上传任务完成
  await Promise.allSettled(activeUploads);
  console.log('📊 所有文件上传任务已结束');
}

4. 可选:添加上传进度提示

如果想给用户显示每个文件的上传进度,可以在上传函数里加进度监听:

async function uploadSingleFileToBlob(file) {
  const blobService = AzureStorage.Blob.createBlobServiceWithSas('你的Blob存储URL', '你的SAS令牌');
  const containerName = '你的容器名';

  return new Promise((resolve, reject) => {
    blobService.createBlockBlobFromBrowserFile(containerName, file.name, file, {
      blockSize: 4 * 1024 * 1024,
    }, (error, result) => {
      if (error) reject(error);
      else resolve(result);
    }, (progressEvent) => {
      // 计算上传进度百分比
      const progressPercent = (progressEvent.loaded / progressEvent.total) * 100;
      console.log(`📈 文件 ${file.name} 上传进度: ${progressPercent.toFixed(2)}%`);
      // 这里可以更新页面上的进度条元素,比如:
      // document.getElementById(`${file.name}-progress`).style.width = `${progressPercent}%`;
    });
  });
}

5. 错误处理小技巧

批量上传时,单个文件失败不要中断整个流程,用try/catch或者Promise.allSettled来捕获错误,最后可以汇总成功和失败的文件,给用户一个清晰的结果。

内容的提问来源于stack exchange,提问作者Sieck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:47:34