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:上传文件时指定内容长度的主要内容,如果未能解决你的问题,请参考以下文章

我可以在没有内容长度标头的情况下将文件上传到 S3 吗?

使用activestorage的直接上传上传到S3时如何指定前缀?

用于将 svg 图像上传到 AWS S3 的内容类型

OpenStack Swift 多部分上传 jclouds

Blueimp 文件上传 - 直接多次上传到 S3

您尝试访问的存储桶必须使用指定的端点进行寻址,同时从 jenkins 上传到 s3