Java 下载文件夹
引导式阅读
Java
Java 下载文件夹
作者
C***
上架时间
2023-11-14 02:53:45

功能介绍

本示例介绍了如何使用华为云 Java SDK 的文件下载接口批量 OBS 桶中具有相同前缀的对象到本地目录。

版本说明

本示例配套的 SDK 版本为 3.21.8.1

准备工作

  1. 参考华为云OBS开发工具包(SDK) 引入 OBS Java SDK
  2. 要使用华为云 Java SDK,您需要拥有华为云账号以及该账号对应的 Access Key(AK)和 Secret Access Key(SK)。请参考OBS服务环境搭建
  3. 获取您桶所在的终端节点 OBS 终端节点列表
  4. 华为云 Java SDK 需要运行在 JDK 1.8 及以上版本

正式使用

在脚本中填入相关信息后即可运行,请填写以下字段:

变量名 变量含义
ak Access Key
sk Secret Access Key
endpoint 终端节点
bucketName 需要下载对象所在桶名
remotePrefix 需要下载对象对象的前缀名
localFolder 需要下载到的本地路径
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对象存储服务