【问题标题】:Can I upload a stream to Azure blob storage without specifying its length upfront?是否可以将流上传到 Azure blob 存储而不预先指定其长度?
【发布时间】:2014-08-28 09:43:07
【问题描述】:

我不知道它是否相关,但我使用 Java 和 azure-storage-android-0.2.0.aar 进行上传。

我可以将文件上传到 Microsoft Azure blob 存储

CloudBlockBlob blob = container.getBlockBlobReference("filename.ext");
blob.upload(inputStream, n);

其中 n 是从文件中派生的 inputStream 的长度。

这是我的问题:我想直接流式传输,例如从摄像头传输,这显然是不可能的,因为 Azure 需要上传的长度参数,在流式传输时该参数是未知的。

我需要指定长度是否有原因? (MD5?)还有没有办法在流还在产生的时候上传(这显然是Java中InputStream的想法,InputStream没有长度属性的原因)?

【问题讨论】:

    标签: java azure azure-storage


    【解决方案1】:

    我们将记录功能请求以启用从流中上传而不指定长度。现在,您可能想要使用 openOutputStream 方法,该方法有一个 write 方法,采用 byte[] 或 int。下面是一个使用 int 方法的例子:

        CloudBlockBlob blockBlob = container.getBlockBlobReference(‘myblob’); // assuming container was already created
    
        BlobOutputStream blobOutputStream = blockBlob.openOutputStream();
        ByteArrayInputStream inputStream = new ByteArrayInputStream(buffer); // assuming buffer is a byte[] with your data
    
        int next = inputStream.read();
        while (next != -1) {
              blobOutputStream.write(next);
              next = inputStream.read();
        }
    
        blobOutputStream.close();
    

    【讨论】:

    • @trailmax 希望这能让您前面提到的 C# 代码更容易。 :) 如果您有任何其他问题,如您之前提到的,请在我们的 GitHub page 或 Stack Overflow 上发布问题/功能请求。我们会定期进行监控,并乐于回答问题并收集反馈。
    • @EmilyGerner-Microsoft :我很好奇 Blob 存储的工作方式是否与服务客户端的工作方式相同。我是否需要添加一个单独的异步任务来完成工作。
    • @TerrilThomas 你能澄清一下吗?您正在使用哪个存储库(语言和版本)?你有代码sn-p吗?或许可以在 Stack Overflow 或适当的 GitHub 存储库中使用此信息提出一个新问题,以便我们更好地为您提供帮助。
    • @EmilyGerner-Microsoft 我已使用您的演示上传图像。它工作正常。但是现在,上传图片后我需要显示它的 url,我该怎么做呢?我的意思是如何获取上传图片的 URL?
    • 根本没有,否则我们会这样做。 :) 长度决定了我们必须如何上传。较小的 blob 在单个 put 中完成,而较大的 blob 需要分块。如果我们不知道长度,我们就无法做出适当的决定。
    【解决方案2】:

    我使用 BlobAsyncClient 完成了以下代码:

    BlobServiceAsyncClient blobServiceAsyncClient = blobServiceClientBuilder.buildAsyncClient();
    
    BlobContainerAsyncClient blobContainerAsyncClient =
        blobServiceAsyncClient.getBlobContainerAsyncClient("container name");
    
    BlobAsyncClient blobAsyncClient =
        blobContainerAsyncClient.getBlobAsyncClient("blob name");
    
    ParallelTransferOptions parallelTransferOptions = new ParallelTransferOptions()
        .setBlockSizeLong(blockSize).setMaxConcurrency(5)
        .setProgressReceiver(bytesTransferred -> log.info("Uploaded bytes:{}", bytesTransferred));
    
    Flux<ByteBuffer> data = Flux.just(ByteBuffer.wrap(byteArray));
    
    blobAsyncClient.upload(data, parallelTransferOptions, true)
        .doOnError(throwable -> log.error("Error occurred while uploading:{}",
            throwable.getMessage()))
        .doOnSuccess(success -> {
          log.info("Blob is uploaded successfully!!:{}", blobAsyncClient.getBlobUrl());
        })
        .subscribe();
    

    【讨论】:

      猜你喜欢
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2016-04-01
      • 2020-01-03
      相关资源
      最近更新 更多