流式下载

最近更新时间:2022-05-31 18:03:17

流式下载

当下载的文件太大或者一次性下载耗时太长时,您可以通过流式下载,一次处理部分内容,直到完成文件的下载。Ks3Object 对象使用完毕后必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。关闭方法如下:

GetObjectResult getObjectResult = client.getObject(bucketName, objectName);
getObjectResult.getObject().close();

以下代码用于流式下载examplebucket中的exampleobject.txt文件。

public GetObjectResult getObject(){
       // yourEndpoint填写Bucket所在地域对应的Endpoint。以中国(北京)为例,Endpoint填写为ks3-cn-beijing.ksyuncs.com。如果使用自定义域名,设置endpoint为自定义域名,同时设置domainMode为true
       String endpoint = "yourEndpoint";
       // 金山云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
       String accessKeyId = "yourAccessKeyId";
       String accessKeySecret = "yourAccessKeySecret";
       // 创建Ks3ClientConfig 实例。
       Ks3ClientConfig config = new Ks3ClientConfig();
       // 设置域名
       config.setEndpoint(endpoint);
       // 创建Ks3Client实例
       Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
       // 填写Bucket名称。
       String bucketName = "examplebucket";
       // 填写Object的完整路径。Object完整路径中不能包含Bucket名称。
       String objectName = "exampleobject.txt";
       // 创建getObject请求,指定
       GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
       // 可以重写返回的header
       // ResponseHeaderOverrides overrides = new ResponseHeaderOverrides();
       // overrides.setContentType("text/html");
       // .......
       // request.setOverrides(overrides);
       // 只接受数据的0-10字节。通过控制该项可以实现分块下载
       // request.setRange(0,10);
  
       // 如果文件是用户提供key的方式进行服务端加密的
  		 // SecretKey sourceKey= ??//当初加密时用的key
			 // request.setSseCustomerKey(new SSECustomerKey(sourceKey));
       // ks3Object包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
       Ks3Object ks3Object = client.getObject(request).getObject();
       // 读取文件内容。
       System.out.println("Object content:");
       BufferedReader reader = new BufferedReader(new InputStreamReader(ks3Object.getObjectContent()));
       while (true) {
              String line = reader.readLine();
              if (line == null) break;
              System.out.println("\n" + line);
       }
       // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
       reader.close();
}

下载到本地文件

本文介绍如何将存储空间(Bucket)中的文件(Object)下载到本地文件。

以下代码用于将examplebucket中testfolder目录下的exampleobject.txt下载到本地D:\localpath路径下的examplefile.txt。

// yourEndpoint填写Bucket所在地域对应的Endpoint。以中国(北京)为例,Endpoint填写为ks3-cn-beijing.ksyuncs.com。如果使用自定义域名,设置endpoint为自定义域名,同时设置domainMode为true
String endpoint = "yourEndpoint";
// 金山云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用子账号账号进行 API 访问或日常运维,请登录 https://uc.console.ksyun.com/pro/iam/#/user/list 创建子账号。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";
// 创建Ks3ClientConfig 实例。
Ks3ClientConfig config = new Ks3ClientConfig();
// 设置域名
config.setEndpoint(endpoint);
// 创建Ks3Client实例
Ks3 client = new Ks3Client(accessKeyId, accessKeySecret, config);
// 填写Bucket名称。
String bucketName = "examplebucket";
// 填写Object的完整路径。Object完整路径中不能包含Bucket名称。
String objectName = "exampleobject.txt";
// 本地文件名,包含路径信息
String fileName = "D:\\localpath\\examplefile.txt";
// 创建getObject请求,指定
GetObjectRequest request = new GetObjectRequest(bucketName, objectName);
// 可以重写返回的header
// ResponseHeaderOverrides overrides = new ResponseHeaderOverrides();
// overrides.setContentType("text/html");
//.......
// request.setOverrides(overrides);
// 只接受数据的0-10字节。通过控制该项可以实现分块下载
// request.setRange(0,10);
// ks3Object包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
Ks3Object ks3Object = client.getObject(request).getObject();
// 创建输入流
BufferedInputStream inputStream = new BufferedInputStream(ks3Object.getObjectContent());
OutputStream outputStream = null;
try {
       // 创建输出文件流
       outputStream = new BufferedOutputStream(new FileOutputStream(fileName));
       byte[] buffer = new byte[1024*1024];
       int bytesRead;
       // 循环获取输入流,并写入文件
       while ((bytesRead = ks3Object.getObjectContent().read(buffer)) != -1) {
              outputStream.write(buffer, 0, bytesRead);
       }
} catch (IOException ex) {
       // 错误处理
} finally {
       // 关闭流
       assert outputStream != null;
       outputStream.close();
       inputStream.close();
}
}   

文档内容是否对您有帮助?

根本没帮助
文档较差
文档一般
文档不错
文档很好

在文档使用中是否遇到以下问题

内容不全,不深入
内容更新不及时
描述不清晰,比较混乱
系统或功能太复杂,缺乏足够的引导
内容冗长

更多建议

0/200

评价建议不能为空

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

问题反馈