在Java应用中有效整合阿里云对象存储服务(OSS),实现文件的自动化下载。通过编写测试用例,初始化OSS客户端,遍历存储桶内的文件资源,并将它们安全下载至本地目录。同时,涵盖目录结构的自动创建及异常处理策略,确保数据传输的完整性和可靠性。
对象存储服务如阿里云OSS成为很多存储海量数据的首选方案。对于开发者而言,掌握如何通过编程接口访问这些存储资源显得尤为关键。这里聚焦Java语言环境下,使用OSS API高效下载文件的测试用例。
引入OSS客户端库、日志框架SLF4J以及文件I/O相关的API的Java包
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectListing;
import com.aliyun.oss.model.OSSObjectSummary;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
定义核心类 OSSDownloader,封装下载逻辑
public class OSSDownloader {
private static final Logger logger = LoggerFactory.getLogger(OSSDownloader.class);
// 配置OSS相关参数
private static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
private static final String ACCESS_KEY_ID = "'AccessKey ID for OSS";
private static final String ACCESS_KEY_SECRET = "AccessKey Secret for OSS";
private static final String BUCKET_NAME = "bucketname";
private static final String DOWNLOAD_DIR = "data/xxx/download";
在 main 方法中,初始化OSS客户端,并通过迭代方式遍历存储桶中的所有对象,利用分页机制确保所有文件都被处理
public static void main(String[] args) {
OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
try {
String marker = null;
boolean truncated = true;
while (truncated) {
ObjectListing objectListing = ossClient.listObjects(BUCKET_NAME, marker);
for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
if (!objectSummary.getKey().endsWith("/")) {
System.out.println("Found object: " + objectSummary.getKey());
downloadObject(ossClient, objectSummary.getKey());
}
}
marker = objectListing.getNextMarker();
truncated = objectListing.isTruncated();
}
} catch (Exception e) {
logger.error("Error occurred during file download process.", e);
} finally {
ossClient.shutdown();
}
}
downloadObject 方法实现了文件下载的核心流程,包括本地目录的创建和文件内容的写入
private static void downloadObject(OSS ossClient, String objectName) {
Path localFilePath = Path.of(DOWNLOAD_DIR, objectName);
try {
Files.createDirectories(localFilePath.getParent());
try (OSSObject ossObject = ossClient.getObject(BUCKET_NAME, objectName);
FileOutputStream fos = new FileOutputStream(localFilePath.toFile())) {
InputStream is = ossObject.getObjectContent();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
logger.info("Downloaded file from OSS bucket: {}", objectName);
}
} catch (IOException e) {
logger.error("Failed to download file from OSS bucket: {}, Error: {}", objectName, e.getMessage());
}
}
通过上述Java代码,演示了如何与阿里云OSS进行交互,实现文件的自动化下载。
其他问题记录
【问题描述】:通过Java、Python代码用例来调用RAM用户的 AK/SK 进行oss的访问是正常的(本地IDEA、不同地域的云服务器),但仅在供应商开发的程序中访问遇到’No such CORS configuration’错误
<Error>
<Code>NoSuchCORSConfiguration</Code>
<Message>The CORS Configuration does not exist.</Message>
<RequestId>xxx</RequestId>
<HostId>xxx.oss-cn-shanghai.aliyuncs.com</HostId>
<BucketName>xxx</BucketName>
<EC>0034-00000001</EC>
<RecommendDoc>https://api.aliyun.com/troubleshoot?q=0034-00000001</RecommendDoc>
</Error>
【分析】:我们供应商接口IP归属上海阿里云,和我的产品隶属同一个地域,理论上是不涉及到跨域(CORS)规则,但供应商的程序接口使用了GetBucketCors接口请求访问OSS资源,GetBucketCors接口用于获取指定存储空间(Bucket)当前的跨域资源共享CORS(Cross-Origin Resource Sharing)规则
【问题小结】:Bucket 未配置跨域(CORS)规则,导致GetBucketCors接口请求访问失败
【解决方法】:给Bucket配置CORS规则后恢复正常