最近更新时间:2022-11-09 17:09:26
当下载的文件太大或者一次性下载耗时太长时,您可以通过流式下载,一次处理部分内容,直到完成文件的下载。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);
/**
* false: (推荐)使用三级域名:{bucketName}.{endpoint}/{objectKey}的形式访问
* true: 使用二级域名:{endpoint}/{bucketName}/{objectKey}的形式访问
* 如果domainMode设置为true,则pathStyleAccess可忽略设置
*/
config.setPathStyleAccess(false);
// 创建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);
/**
* false: (推荐)使用三级域名:{bucketName}.{endpoint}/{objectKey}的形式访问
* true: 使用二级域名:{endpoint}/{bucketName}/{objectKey}的形式访问
* 如果domainMode设置为true,则pathStyleAccess可忽略设置
*/
config.setPathStyleAccess(false);
// 创建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();
}
纯净模式