JClouds S3:上传文件时指定内容长度

时间:2014-02-28 20:32:04

标签: amazon-s3 jclouds http-content-length

我使用JClouds 1.6.2编写了一个应用程序,并且有像

这样的文件上传代码
java.io.File file = ...
blobStore.putBlob(containerName,
    blobStore.blobBuilder(name)
    .payload(file)
    .calculateMD5()
    .build()
);

这非常有效。

现在,在jclouds 1.7中,不推荐使用BlobStore.calculateMD5()。此外,即使手动计算MD5哈希值(使用guava Hashing)并使用BlobStore.contentMD5()传递它,我也会收到以下错误:

java.lang.IllegalArgumentException: contentLength must be set, streaming not supported

很明显,我还必须设置内容长度。

计算正确内容长度的最简单方法是什么?

实际上我不认为,jclouds突然删除了对功能的支持,并使上传文件变得更加困难。有没有办法让jclouds计算MD5和/或内容长度?

1 个答案:

答案 0 :(得分:4)

你应该使用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复制的功能,并使某些操作(例如散列)的一些成本更加明显。