正式使用
在脚本中填入相关信息后即可运行,请填写以下字段:
变量名 |
变量含义 |
ak |
Access Key |
sk |
Secret Access Key |
endpoint |
终端节点 |
bucketName |
需要下载对象所在桶名 |
remotePrefix |
需要下载对象对象的前缀名 |
localFolder |
需要下载到的本地路径 |
Copied!
public class DownloadFolder {
public static void main(String[] args) {
String ak = System.getenv("HUAWEICLOUD_SDK_AK");
String sk = System.getenv("HUAWEICLOUD_SDK_SK");
String endpoint = "http://your-endpoint";
ObsClient obsClient = new ObsClient(ak, sk, endpoint);
String bucketName = "you-bucket-name";
String remotePrefix = "remote_prefix";
String localFolder = "you/local/path";
List<String> failedList = new ArrayList<>();
int prefixLength = remotePrefix.length();
ListObjectsRequest listRequest = new ListObjectsRequest();
listRequest.setPrefix(remotePrefix);
listRequest.setBucketName(bucketName);
listRequest.setEncodingType("url");
ObjectListing objects;
for (int i = 1; ; i++) {
System.out.println("Start to Download page " + i);
try {
objects = obsClient.listObjects(listRequest);
} catch (ObsException e) {
System.out.println("Request Error, RequestID is: " + e.getErrorRequestId());
throw e;
}
for (ObsObject object: objects.getObjects()) {
DownloadFileRequest downloadRequest = new DownloadFileRequest(bucketName, object.getObjectKey());
String downloadPath = Paths.get(localFolder,
object.getObjectKey().substring(prefixLength).replace("/", File.separator)).toString();
downloadRequest.setDownloadFile(downloadPath);
downloadRequest.setTaskNum(10);
try {
System.out.println("Start to download object [" + object.getObjectKey()
+ "] to [" + downloadPath + "]");
obsClient.downloadFile(downloadRequest);
} catch (ObsException e) {
System.out.println("Failed to download " + object.getObjectKey()
+ " RequestID: " + e.getErrorRequestId());
failedList.add(object.getObjectKey());
} catch (Exception e) {
failedList.add(object.getObjectKey());
}
}
if (!objects.isTruncated()) {
break;
}
listRequest.setMarker(objects.getNextMarker());
}
failedList.forEach(item -> System.out.println("Failed to download " + item + ", please try again"));
}
}
功能介绍
本示例介绍了如何使用华为云 Java SDK 的文件下载接口批量 OBS 桶中具有相同前缀的对象到本地目录。
版本说明
本示例配套的 SDK 版本为 3.21.8.1
准备工作
正式使用
在脚本中填入相关信息后即可运行,请填写以下字段:
public class DownloadFolder { public static void main(String[] args) { // 认证用的ak和sk直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 String ak = System.getenv("HUAWEICLOUD_SDK_AK"); String sk = System.getenv("HUAWEICLOUD_SDK_SK"); String endpoint = "http://your-endpoint"; ObsClient obsClient = new ObsClient(ak, sk, endpoint); String bucketName = "you-bucket-name"; String remotePrefix = "remote_prefix"; String localFolder = "you/local/path"; List<String> failedList = new ArrayList<>(); int prefixLength = remotePrefix.length(); ListObjectsRequest listRequest = new ListObjectsRequest(); listRequest.setPrefix(remotePrefix); listRequest.setBucketName(bucketName); listRequest.setEncodingType("url"); ObjectListing objects; for (int i = 1; ; i++) { System.out.println("Start to Download page " + i); try { objects = obsClient.listObjects(listRequest); } catch (ObsException e) { System.out.println("Request Error, RequestID is: " + e.getErrorRequestId()); throw e; } for (ObsObject object: objects.getObjects()) { DownloadFileRequest downloadRequest = new DownloadFileRequest(bucketName, object.getObjectKey()); // 将对象名转换为本地路径 String downloadPath = Paths.get(localFolder, object.getObjectKey().substring(prefixLength).replace("/", File.separator)).toString(); downloadRequest.setDownloadFile(downloadPath); // 设置并发下载数为 10 downloadRequest.setTaskNum(10); try { System.out.println("Start to download object [" + object.getObjectKey() + "] to [" + downloadPath + "]"); obsClient.downloadFile(downloadRequest); } catch (ObsException e) { System.out.println("Failed to download " + object.getObjectKey() + " RequestID: " + e.getErrorRequestId()); failedList.add(object.getObjectKey()); } catch (Exception e) { failedList.add(object.getObjectKey()); } } if (!objects.isTruncated()) { break; } // 使用上次返回的 next_marker 作为下次列举的 marker listRequest.setMarker(objects.getNextMarker()); } failedList.forEach(item -> System.out.println("Failed to download " + item + ", please try again")); } }
备注
对象存储并没有文件夹的概念,所有对象均为同一层级。为了方便查看,OBS 使用 / 作为分隔符,将具有相同前缀的对象划分至同一文件夹展示。
参考
更多信息请参考OBS对象存储服务