华为云OBS对象存储使用临时URL访问,并对下载文件重命名

文章介绍了如何使用华为云OBS的临时URL进行文件下载,并着重讲解了如何通过设置响应头实现下载文件的重命名。作者通过官方文档和代码示例展示了获取临时URL的步骤,并探讨了设置response-content-disposition参数来控制下载文件名的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解读

在使用OBS进行对云上文件进行下载的时候,发现,获取临时的url下载的时候不能对文件进行重命名(就是根据临时url下载的时候只能下载上传到云对象的文件名称,不能覆盖这个url下载自定义的文件名),这个就很无语了。最令人惊奇的是,提交了工单,问是否有其功能时,居然被告知无该功能,就很诡异。所以就根据文档重写响应头,摸索查看,最终还是解决了问题。
下面是两个内容点:
1.直接获取临时url,这个跟官方的差不多,基本上照搬即可。
2.获取临时url,并且可以对下载文件重命名。( 本文重点

1.使用临时URL访问OBS,并获取临时URL

官方文档

华为云: 通过临时URL访问OBS

举例

注: 这里官方已经说的很清楚了,直接上代码

	//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这个方法里边,并且进行了处理转化。transGetObjectParams
在这里插入图片描述
然后又回到获取临时url下载这里,其实文档中有个很深的例子,看了很久才发现就是获取图片转码的下载链接 官方文档

截图如下:在这里插入图片描述
这里使用了一个map,并使用setQueryParams给TemporarySignatureRequest对象赋值。但是这个方法里边是说:Set request query parameters. 设置请求查询参数。

setQueryParams
其实也不太清楚这个方法具体有啥用,不过看文档中大概也是这样写的,就直接创建一个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是否安全或者有啥影响,如果有知道的小伙伴大家可以多多交流。

### 华为云OBS对象存储Java SDK使用指南 #### 依赖引入 为了能够在项目中集成使用华为云OBS对象存储服务,需先在项目的`pom.xml`文件里加入如下Maven依赖: ```xml <dependency> <groupId>com.huaweicloud</groupId> <artifactId>esdk-obs-java</artifactId> <version>3.21.12</version> </dependency> ``` 此版本号可能随时间更新而变化,请查阅官方文档获取最新版次[^1]。 #### 初始化客户端 创建ObsClient实例用于后续操作前,应确保已设置好环境变量或配置文件中的认证信息(Access Key ID 和 Secret Access Key),以便成功连接至华为云账户下的资源。以下是初始化代码片段: ```java import com.obs.services.ObsClient; // ... String ak = "your-access-key-id"; String sk = "your-secret-access-key"; String endpoint = "https://your-endpoint"; ObsClient obsClient = new ObsClient(ak, sk, endpoint); ``` 此处endpoint参数取决于所选区域的服务地址,具体可参见官方文档说明。 #### 文件上传功能实现 利用上述构建好的ObsClient对象执行PUT请求完成文件上传动作,下面是一段简单的例子展示如何将本地路径指定的一个文件上传到特定桶内: ```java import java.io.File; public void uploadFile(String bucketName, String objectKey, File file){ try { PutObjectResult putObjectResult = obsClient.putObject(bucketName, objectKey, file); System.out.println("Etag:" + putObjectResult.getETag()); System.out.println("VersionId:" + putObjectResult.getVersionId()); } catch (Exception e) { e.printStackTrace(); } } ``` 这段程序会打印出返回的etag以及版本ID作为确认标志。 #### 文件下载逻辑编写 对于从OBS拉取数据而言,则可通过调用get方法来达成目的;这里提供了一个基础示例用来读取远端对象的内容流,将其保存成新的本地文件形式: ```java import java.nio.file.Files; import java.nio.file.Paths; public void downloadFile(String bucketName, String objectKey, String localFilePath){ try{ ObjectMetadata metadata = obsClient.getObject(new GetObjectRequest(bucketName, objectKey), Paths.get(localFilePath)); System.out.println("Content-Type: " + metadata.getContentType()); }catch(Exception ex){ ex.printStackTrace(); } } ``` 该函数接收三个字符串类型的参数分别代表目标容器名称、待检索键名及期望存放位置,最终输出的是HTTP响应头里的content-type字段值。 #### 资源管理与清理工作 当不再需要某个已经存在的bucket或者想要移除其中部分object时,可以借助deleteBucket/deleteObjects API接口来进行相应处理。需要注意的是,在实际应用环境中应当谨慎对待这些命令以免误删重要资料。 ```java // 删除单个对象 DeleteObjectResult deleteObjectResult = obsClient.deleteObject(bucketName, objectKey); // 批量删除多个对象 List<String> keysToDelete = Arrays.asList("key1", "key2"); DeleteObjectsResponse response = obsClient.deleteObjects( DeleteObjectsRequest.builder() .withQuiet(false) .addKeys(keysToDelete.toArray(new String[0])) .build(), bucketName); ``` 以上即是对华为云OBS对象存储服务基本使用的介绍,涵盖了SDK接入准备阶段直至常见CRUD操作的具体实践过程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值