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, и сделать некоторые затраты на некоторые операции, например, хеширование, более очевидными.

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