Можно ли загрузить поток в хранилище BLOB-объектов Azure, не указав его длину заранее?

Я не знаю, уместно ли это, но я использую Java с azure-storage-android-0.2.0.aar для загрузки.

Я могу загружать файлы в хранилище BLOB-объектов Microsoft Azure

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

где n - длина inputStream, когда он получен из файла.

Вот моя проблема: я хотел бы осуществлять потоковую передачу напрямую, например, с камеры, что, по-видимому, невозможно, поскольку Azure требует для загрузки параметр длины, который неизвестен во время потоковой передачи.

Есть ли причина, по которой мне нужно указать длину? (MD5?) И есть ли способ выгрузки, когда поток все еще создается (что, очевидно, является идеей InputStream в Java, причина, по которой InputStream не имеет свойства длины)?

2 ответа

Решение

Мы запишем запрос функции, чтобы разрешить загрузку из потока без указания длины. Сейчас вы можете захотеть использовать метод 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();

Я сделал это с помощью 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();
Другие вопросы по тегам