JClouds S3: укажите длину содержимого при загрузке файла
Я написал приложение, используя JClouds 1.6.2 и имел код загрузки файла, как
java.io.File file = ...
blobStore.putBlob(containerName,
blobStore.blobBuilder(name)
.payload(file)
.calculateMD5()
.build()
);
Это сработало на отлично.
Теперь в jclouds 1.7 BlobStore.calculateMD5() устарела. Более того, даже если вычислить хеш MD5 вручную (с использованием хеширования гуавы) и передать его с помощью BlobStore.contentMD5(), я получаю следующую ошибку:
java.lang.IllegalArgumentException: contentLength must be set, streaming not supported
Поэтому, очевидно, я также должен установить длину контента.
Какой самый простой способ рассчитать правильную длину контента?
На самом деле я не думаю, что jclouds внезапно убрала поддержку функций и делает загрузку файлов намного сложнее. Есть ли способ позволить jclouds рассчитать MD5 и / или длину контента?
1 ответ
Вы должны работать с ByteSource, который предлагает несколько вспомогательных методов:
ByteSource byteSource = Files.asByteSource(new File(...));
Blob blob = blobStore.blobBuilder(name)
.payload(byteSource)
.contentLength(byteSource.size())
.contentMD5(byteSource.hash(Hashing.md5()).asBytes())
.build();
blobStore.putBlob(containerName, blob);
jclouds внесла эти изменения, чтобы удалить функциональность, дублированную Guava, и сделать некоторые затраты на некоторые операции, например, хеширование, более очевидными.