解读
在使用OBS进行对云上文件进行下载的时候,发现,获取临时的url下载的时候不能对文件进行重命名(就是根据临时url下载的时候只能下载上传到云对象的文件名称,不能覆盖这个url下载自定义的文件名),这个就很无语了。最令人惊奇的是,提交了工单,问是否有其功能时,居然被告知无该功能,就很诡异。所以就根据文档重写响应头,摸索查看,最终还是解决了问题。
下面是两个内容点:
1.直接获取临时url,这个跟官方的差不多,基本上照搬即可。
2.获取临时url,并且可以对下载文件重命名。( 本文重点 )
1.使用临时URL访问OBS,并获取临时URL
官方文档
举例
注: 这里官方已经说的很清楚了,直接上代码
//objectkey :上传路径 (不带桶名的路径)
public String getDownloadUrl(String objectkey) {
// URL有效期,3600秒
long expireSeconds = 3600L;
TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);
//设置桶名,一般都是写在配置里,这里直接赋值即可
request.setBucketName("bucketname");
//这里相当于设置你上传到obs的文件路
request.setObjectKey(objectkey);
TemporarySignatureResponse response = obsClient.createTemporarySignature(request);
return response.getSignedUrl();
}
如上,直接就可以获取到你上传到OBS的临时路径了
2.使用临时URL访问OBS,并对临时URL下载的文件重命名
分析
到这里,其实卡住了,当时找了api只找到了一个api里边提供的一个 重写响应头述
其实官方提供了获取下载对象的可以重写响应头的文档,但是这好像又跟我获取临时URL的不是很挨边。所以就通过这个getObject(GetObjectRequest request)这个方法进去看。
追踪发现 文档中重写响应头的最终到了transGetObjectParams这个方法里边,并且进行了处理转化。
然后又回到获取临时url下载这里,其实文档中有个很深的例子,看了很久才发现就是获取图片转码的下载链接 官方文档
截图如下:
这里使用了一个map,并使用setQueryParams给TemporarySignatureRequest对象赋值。但是这个方法里边是说:Set request query parameters. 设置请求查询参数。
其实也不太清楚这个方法具体有啥用,不过看文档中大概也是这样写的,就直接创建一个map,把我需要的传了进去
queryParams.put("response-content-disposition", String.format("attachment;filename=\"%s\"", fileName));
然后这样下载的临时url下载下来的就是我重命名的文件名(不过官方代码里边写的一言难尽啊,你都不知道他要干啥)
举例
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
//objectkey :上传路径 (不带桶名的路径)
//fileName :重命名的文件(eg: rename.txt)
public String getDownloadUrl(String objectkey,String fileName) {
// URL有效期,3600秒
long expireSeconds = 3600L;
TemporarySignatureRequest request = new TemporarySignatureRequest(HttpMethodEnum.GET, expireSeconds);
//设置桶名,一般都是写在配置里,这里直接赋值即可
request.setBucketName("bucketname");
//这里相当于设置你上传到obs的文件路
request.setObjectKey(objectkey);
Map<String, Object> queryParams = new HashMap<>(8);
try {
queryParams.put("response-content-disposition", String.format("attachment;filename=%s", URLEncoder.encode(rename, "UTF-8")));
} catch (UnsupportedEncodingException e) {
log.error("UnsupportedEncodingException:", e);
}
request.setQueryParams(queryParams);
TemporarySignatureResponse response = obsClient.createTemporarySignature(request);
return response.getSignedUrl();
}
不过虽然这样解决了,但是却不清楚这样生成的URL是否安全或者有啥影响,如果有知道的小伙伴大家可以多多交流。