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

Posted

技术标签:

【中文标题】JClouds S3:上传文件时指定内容长度【英文标题】:JClouds S3: Specify Content Length when uploading file 【发布时间】:2014-04-02 01:12:12 【问题描述】:

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

【讨论】:

以上是关于JClouds S3:上传文件时指定内容长度的主要内容,如果未能解决你的问题,请参考以下文章