Можно ли загрузить поток в хранилище 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();