Загрузка BLOB-объектов в Azure с использованием BlobOutputStream

Я пытаюсь загрузить большой двоичный объект прямо из потока, так как я не знаю длину потока, поэтому я решил попробовать этот ответ.

Это не работает, даже если он читает из потока и не выдает никаких исключений, содержимое не загружается в мой контейнер.

У меня нет проблем с загрузкой из файлов, это происходит только при загрузке из потока.

Это мой код, я добавил несколько аутов, чтобы проверить, читает ли он что-то или нет, но это не было проблемой:

try {
    CloudBlockBlob blob = PublicContainer.getBlockBlobReference(externalFileName);
    if (externalFileName.endsWith(".tmp")) {
        blob.getProperties().setContentType("image/jpeg");
    }
    BlobOutputStream blobOutputStream = blob.openOutputStream();
    int next = input.read();
    while (next != -1) {
        System.err.println("writes");
        blobOutputStream.write(next);
        next = input.read();
    }
    blobOutputStream.close();
    return blob.getUri().toString();

} catch (Exception usex) {
    System.err.println("ERROR " + usex.getMessage());
    return "";
}

Это не терпит неудачу, но это не работает.

Есть ли другой способ сделать это? Или я что-то упустил?

ОБНОВЛЕНИЕ: я проверял и думаю, что проблема в самом InputStream, но я не знаю почему, поскольку тот же поток будет работать нормально, если я использую его для загрузки в Amazon s3, например

1 ответ

Я пытался воспроизвести вашу проблему, но не удалось. Согласно вашему коду, кажется, что единственное очевидное пропущенное - это отсутствие вызова blobOutputStream.flush(); прежде чем закрыть выходной поток через blobOutputStream.close();, но это работает, если отсутствует flush метод

Вот мой код тестирования, как показано ниже.

String STORAGE_CONNECTION_STRING_TEMPLATE = "DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;";

String accountName = "xxxx";
String key = "XXXXXX";
CloudStorageAccount account = CloudStorageAccount.parse(String.format(STORAGE_CONNECTION_STRING_TEMPLATE, accountName, key));
CloudBlobClient client = account.createCloudBlobClient();
CloudBlobContainer container = client.getContainerReference("mycontainer");
container.createIfNotExists();
String externalFileName = "test.tmp";
CloudBlockBlob blob = container.getBlockBlobReference(externalFileName);
if (externalFileName.endsWith(".tmp")) {
    blob.getProperties().setContentType("image/jpeg");
}
BlobOutputStream blobOutputStream = blob.openOutputStream();
String fileName = "test.jpg";
InputStream input = new FileInputStream(fileName);
int next = -1;
while((next = input.read()) != -1) {
    blobOutputStream.write(next);
}
blobOutputStream.close(); // missing in your code, but works if missing.
input.close();

Если вы можете обновить более подробно, я думаю, что это поможет для анализа проблемы. Любая проблема, пожалуйста, не стесняйтесь, дайте мне знать.

Другие вопросы по тегам