Загрузка 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();
Если вы можете обновить более подробно, я думаю, что это поможет для анализа проблемы. Любая проблема, пожалуйста, не стесняйтесь, дайте мне знать.