使用jclouds上传B2存储桶时遇Cache-Control头不支持错误
解决jclouds上传Backblaze B2时Cache-Control头不支持的异常
这个问题的核心原因是jclouds默认会自动为上传的Blob添加Cache-Control头,但Backblaze B2的上传API默认不允许客户端自定义这个头,导致服务端返回错误触发了IllegalArgumentException。
下面是几种可行的解决方案:
1. 显式移除自动添加的Cache-Control头
在构建Blob对象时,直接清除jclouds自动注入的Cache-Control元数据:
PayloadBlobBuilder blobBuilder = blobStore.blobBuilder(remoteFileName) .payload(payload) .contentLength(payload.size()) .withoutMetadata("Cache-Control"); // 移除自动添加的Cache-Control头 Blob blob = blobBuilder.build(); String eTag = blobStore.putBlob(containerName, blob);
这个方法直接针对当前Blob的构建过程,能快速解决单个上传请求的问题。
2. 全局配置禁用自动添加Cache-Control头
如果你的应用中有大量上传操作,可以在创建BlobStoreContext时全局配置,避免每个请求重复处理:
import java.util.Properties; import org.jclouds.ContextBuilder; import org.jclouds.blobstore.BlobStore; import org.jclouds.blobstore.BlobStoreContext; // 配置属性,指定要移除的默认HTTP头 Properties props = new Properties(); props.setProperty("jclouds.http.headers.remove", "Cache-Control"); // 构建BlobStoreContext时应用配置 BlobStoreContext context = ContextBuilder.newBuilder("backblaze-b2") .credentials("你的B2账户ID", "你的应用密钥") .overrides(props) .buildView(BlobStoreContext.class); BlobStore blobStore = context.getBlobStore();
这种方式一劳永逸,所有通过这个BlobStore上传的Blob都会自动跳过Cache-Control头的添加。
3. 升级jclouds B2模块版本
如果使用的是较旧版本的jclouds,可能存在对B2 API支持不完善的情况。建议升级到最新的backblaze-b2 provider版本(比如最新的2.x系列),新版本大概率已经修复了默认头的兼容问题。
额外说明:如何设置缓存策略(如果需要)
如果你确实需要对对象设置缓存控制,不要在上传时单独指定Cache-Control头,而是通过以下方式:
- 在Backblaze B2控制台中,为目标Bucket设置默认Cache-Control策略,所有上传到该Bucket的对象会自动继承这个设置;
- 或者使用B2的API设置Bucket的
defaultCacheControl属性,jclouds也支持通过BlobStore.setBucketMetadata来配置这个属性。
内容的提问来源于stack exchange,提问作者Timothy Anyona
相关产品推荐
相关产品推荐

