Java与阿里云OSS:实现高效文件下载

在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规则后恢复正常

上一篇
下一篇