Oliver Hausler
Oliver Hausler

Reputation: 4987

Can I upload a stream to Azure blob storage without specifying its length upfront?

I don't know if it's relevant, but I am using Java with the azure-storage-android-0.2.0.aar for the upload.

I can upload files to Microsoft Azure blob storage

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

where n is the length of the inputStream when it is derived from the file.

Here's my problem: I would like to stream directly, for example from the camera, which apparently isn't possible as Azure requires the length parameter for the upload, which is unknown while still streaming.

Is there a reason why I need to specify the length? (MD5?) And is there a way to upload while the stream is still being produced (which obviously is the idea of an InputStream in Java, the reason why InputStream does not have a length property)?

Upvotes: 9

Views: 9689

Answers (2)

Devesh Kumar
Devesh Kumar

Reputation: 73

I did it using BlobAsyncClient below is the code for that:

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();

Upvotes: 1

Emily Gerner
Emily Gerner

Reputation: 2457

We’ll log feature request to enable uploading from a stream without specifying length. For now, you may want to use the openOutputStream method which has a write method taking a byte[] or an int. An example using the int method is below:

    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();

Upvotes: 12

Related Questions