Azure Blob Storage - 带有进度的上传文件

3
我有以下代码 - 它通常用于将文件上传到Azure-Blob-Storage,但是当我上传文件时,onProgress 只在一次执行(而且总是)并发送慢速的文件大小值到Azure,进度只在完成后执行一次。
    const requestOptions = this.mergeWithDefaultOptions(perRequestOptions);
    const client = this.getRequestClient(requestOptions);
    const containerClient = await client.getContainerClient(this.options.containerName);
    const blobClient = await containerClient.getBlockBlobClient(file.name);
    const uploadStatus = await blobClient.upload(file.buffer, file.size, {onProgress: progressCallBack});

我想知道这个库的输出是否正常(对于从Azure下载文件,相同的方法可以正确地工作)。
1个回答

9
根据我的测试,该方法是一种非并行上传方法,只向Azure存储服务器发送单个Put Blob请求。更多详情请参见此处输入图像描述 所以,如果您想多次执行onProgress,我建议您使用uploadStream方法。它使用Put Block操作和Put Block List操作进行上传。更多详情请参考这里
例如:
try {
    var creds = new StorageSharedKeyCredential(accountName, accountKey);
    var blobServiceClient = new BlobServiceClient(
      `https://${accountName}.blob.core.windows.net`,
      creds
    );
    var containerClient = blobServiceClient.getContainerClient("upload");
    var blob = containerClient.getBlockBlobClient(
      "spark-3.0.1-bin-hadoop3.2.tgz"
    );

    var maxConcurrency = 20; // max uploading concurrency
    var blockSize = 4 * 1024 * 1024; // the block size in the uploaded block blob
    var res = await blob.uploadStream(
      fs.createReadStream("d:/spark-3.0.1-bin-hadoop3.2.tgz", {
        highWaterMark: blockSize,
      }),
      blockSize,
      maxConcurrency,
      { onProgress: (ev) => console.log(ev) }
    );
    console.log(res._response.status);
  } catch (error) {
    console.log(error);
  }

enter image description here


我也是这么想的,但我不明白为什么你甚至需要在一次性执行的函数中使用onProgress。我将其设置为答案,因为它确认了我的想法。谢谢! - Seti
@Seti,既然这对您有用,能否请您将其接受为答案:https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - Jim Xu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接