开发者社区 > 云存储 > 对象存储OSS > 正文

如何使用java的SDK下载OSS中指定日期内产生的文件

需求:

本人想用官方提供的Java接口下载OSS中指定日期产生的文件

问题:

查阅官方文档好像都要指定具体的文件名,如何只提供日期参数,然后就可以将桶中满足条件的文件下载到本地。

展开
收起
1084845572362231 2023-08-02 12:14:12 178 0
7 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    要使用阿里云的Java SDK下载OSS中指定日期内产生的文件,您可以通过以下步骤实现:

    1. 导入依赖:确保您已经在Java项目中添加了阿里云Java SDK的依赖。您可以在项目的pom.xml文件中添加以下依赖:

      <dependency>
       <groupId>com.aliyun.oss</groupId>
       <artifactId>aliyun-sdk-oss</artifactId>
       <version>3.12.0</version>
      </dependency>
      
    2. 创建OSSClient对象:使用您的OSS访问凭证信息,创建OSSClient对象来连接到您的OSS存储空间。示例代码如下:
      ```java
      String endpoint = "your_oss_endpoint"; // OSS的访问域名,例如oss-cn-beijing.aliyuncs.com
      String accessKeyId = "your_access_key_id"; // 您的AccessKeyId
      String accessKeySecret = "your_access_key_secret"; // 您的AccessKeySecret

    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

    
    3. 获取指定日期范围内的文件:使用`listObjects`方法获取指定日期范围内的文件。您可以设置`prefix`参数来指定要查找的文件夹路径,设置`marker`参数来指定查找的位置,设置`startTime`和`endTime`参数指定日期范围,例如:
    ```java
    String bucketName = "your_bucket_name"; // 您的存储空间名称
    String prefix = "folder_name/"; // 指定的文件夹路径
    String marker = null; // 标记起始位置,如果有分页需求可以使用该参数
    Date startTime = new SimpleDateFormat("yyyy-MM-dd").parse("2023-01-01"); // 指定起始日期
    Date endTime = new SimpleDateFormat("yyyy-MM-dd").parse("2023-01-31"); // 指定结束日期
    
    ListObjectsRequest request = new ListObjectsRequest(bucketName)
            .withPrefix(prefix)
            .withMarker(marker)
            .withStartTime(startTime)
            .withEndTime(endTime);
    
    ObjectListing objectListing = ossClient.listObjects(request);
    List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
    
    1. 下载文件:根据获取到的文件列表,使用OSSClient的getObject方法来逐个下载文件。示例代码如下:

      for (OSSObjectSummary object : objectSummaries) {
       String key = object.getKey(); // 文件的路径和名称
       String localFilePath = "local_path/" + key; // 本地保存路径和文件名称
       ossClient.getObject(new GetObjectRequest(bucketName, key), new File(localFilePath));
      }
      
    2. 关闭OSSClient:下载完成后,记得关闭OSSClient。

      ossClient.shutdown();
      
    2023-08-28 15:57:46
    赞同 展开评论 打赏
  • 十分耕耘,一定会有一分收获!

    楼主你好,首先,需要利用OSS提供的Java SDK中的ListObjectsRequest类来列举指定日期内的文件。

    具体实现步骤如下:

    1. 创建OSS客户端对象
      image.png
    1. 创建ListObjectsRequest对象
      image.png

    其中,prefix为需要列举文件的前缀,也就是目录路径,delimiter可以设置为/,来模拟目录结构,本文不需要列举文件夹,因此留空,marker为列举文件的起始位置,startDateendDate为列举文件的时间范围。

    1. 调用listObjects方法进行列举操作
      image.png
    1. 遍历ossObjectSummaries,下载文件
      image.png

    完整代码示例:

    import java.util.Date;
    import java.io.File;
    import java.util.List;
    import com.aliyun.oss.OSS;
    import com.aliyun.oss.OSSClientBuilder;
    import com.aliyun.oss.model.GetObjectRequest;
    import com.aliyun.oss.model.ListObjectsRequest;
    import com.aliyun.oss.model.ObjectListing;
    import com.aliyun.oss.model.OSSObjectSummary;
    
    public class OSSDemo {
        public static void main(String[] args) {
            String endpoint = "http://oss-cn-hangzhou.aliyuncs.com"; //OSS地址
            String accessKeyId = "your-accessKeyId"; //阿里云账号的Access Key ID
            String accessKeySecret = "your-accessKeySecret"; //阿里云账号的Access Key Secret
            String bucketName = "your-bucketName"; //要访问的Bucket名称
            String prefix = "your-prefix/"; //只列举指定前缀的文件
            String delimiter = ""; //不需要列举文件夹,因此留空
            String marker = null; //列举文件的起始位置
            Date startDate = new Date(System.currentTimeMillis() - 24*60*60*1000); //要列举的起始日期
            Date endDate = new Date(System.currentTimeMillis()); //要列举的结束日期
            String localFileDir = "your-localFileDir/"; //本地文件目录
    
            // 创建OSSClient实例
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            //设置列举条件
            ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName)
                    .withPrefix(prefix)
                    .withDelimiter(delimiter)
                    .withMarker(marker)
                    .withTimeRange(startDate, endDate);
    
            //列举符合条件的文件
            ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
            List<OSSObjectSummary> ossObjectSummaries = objectListing.getObjectSummaries();
    
            //遍历文件,下载到本地
            for (OSSObjectSummary objectSummary : ossObjectSummaries) {
                String key = objectSummary.getKey();
                String localFile = localFileDir + key.substring(key.lastIndexOf("/") + 1);
                ossClient.getObject(new GetObjectRequest(bucketName, key), new File(localFile));
            }
    
            // 关闭OSSClient
            ossClient.shutdown();
        }
    }
    
    2023-08-07 11:10:15
    赞同 展开评论 打赏
  • 要使用Java SDK下载指定日期内产生的文件,你可以按照以下步骤操作:
    image.png

    1. 引入依赖:首先,在你的Java项目中,需要引入阿里云OSS的Java SDK依赖。你可以在项目的Maven或Gradle配置文件中添加相关依赖。

      Maven 依赖配置:

      <dependency>
          <groupId>com.aliyun.oss</groupId>
          <artifactId>aliyun-sdk-oss</artifactId>
          <version>3.x.x</version>
      </dependency>
      
    2. 初始化客户端:使用你的OSS配置信息初始化OSS客户端。这需要包括访问密钥、Endpoint地址等信息。

      import com.aliyun.oss.OSS;
      import com.aliyun.oss.OSSClientBuilder;
      
      String endpoint = "<your_endpoint>";
      String accessKeyId = "<your_access_key_id>";
      String accessKeySecret = "<your_access_key_secret>";
      
      // 初始化OSS客户端
      OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
      
    3. 构造日期范围:根据你的需求,构造起始日期和结束日期。

      import java.util.Date;
      import java.text.SimpleDateFormat;
      
      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
      Date startDate = dateFormat.parse("<start_date>");
      Date endDate = dateFormat.parse("<end_date>");
      
    4. 列举目录中的文件:使用OSS客户端的listObjects方法列举指定目录下的所有文件,并根据日期范围进行筛选。

      import com.aliyun.oss.model.ListObjectsRequest;
      import com.aliyun.oss.model.ObjectListing;
      import com.aliyun.oss.model.OSSObjectSummary;
      
      String bucketName = "<your_bucket_name>";
      String prefix = "<your_folder_prefix>";
      
      ListObjectsRequest listRequest = new ListObjectsRequest(bucketName);
      listRequest.setPrefix(prefix);
      
      ObjectListing objectListing;
      do {
          objectListing = ossClient.listObjects(listRequest);
          for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
              Date fileDate = objectSummary.getLastModified();
              if (fileDate.after(startDate) && fileDate.before(endDate)) {
                  // 满足日期条件,下载文件到本地
                  String objectKey = objectSummary.getKey();
                  ossClient.getObject(new GetObjectRequest(bucketName, objectKey), new File("<local_path>"));
              }
          }
          listRequest.setMarker(objectListing.getNextMarker());
      } while (objectListing.isTruncated());
      

    以上代码片段列举了指定目录下所有满足日期条件的文件,并将其下载到本地路径。你只需要根据实际情况替换代码中的参数(如Endpoint、Access Key、起始日期、结束日期、桶名、前缀和本地路径),即可实现你的需求。

    请注意确保在使用完毕后关闭OSS客户端:

    ossClient.shutdown();
    

    image.png

    2023-08-02 16:30:37
    赞同 3 展开评论 打赏
  • 北京阿里云ACE会长

    要使用Java SDK下载OSS中指定日期内产生的文件,可以使用OSS Java SDK中提供的ListObjectsRequest和OSSObject类。具体来说,可以按照以下步骤进行操作:

    创建OSSClient实例并指定访问的Endpoint、AccessKeyId和AccessKeySecret:
    java
    Copy
    String endpoint = "yourEndpoint";
    String accessKeyId = "yourAccessKeyId";
    String accessKeySecret = "yourAccessKeySecret";

    OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
    创建ListObjectsRequest对象,并设置Bucket名称、过滤条件和日期范围:
    java
    Copy
    String bucketName = "yourBucketName";
    String prefix = "yourPrefix"; // 可选,指定要过滤的前缀
    String delimiter = "/"; // 可选,指定目录分隔符
    Date startDate = new Date(System.currentTimeMillis() - 246060*1000); // 设定开始时间
    Date endDate = new Date(); // 设定结束时间

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
    listObjectsRequest.setPrefix(prefix);
    listObjectsRequest.setDelimiter(delimiter);
    listObjectsRequest.setMarker(marker);

    // 设定日期范围
    listObjectsRequest.setStartTime(startDate);
    listObjectsRequest.setEndTime(endDate);
    调用OSSClient的listObjects方法获取指定日期范围内的文件列表:
    java
    Copy
    ObjectListing listing = ossClient.listObjects(listObjectsRequest);
    List objectSummaries = listing.getObjectSummaries();

    for (OSSObjectSummary summary : objectSummaries) {
    String key = summary.getKey();
    String bucket = summary.getBucketName();

    // 下载文件
    OSSObject object = ossClient.getObject(bucket, key);
    InputStream inputStream = object.getObjectContent();
    // 处理文件流
    inputStream.close();
    
    2023-08-02 16:24:52
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    要使用Java的SDK下载OSS(阿里云对象存储服务)中指定日期范围内产生的文件,可以按照以下步骤进行操作:

    1. 确保已正确设置好Java开发环境,并在项目中引入阿里云的Java SDK。

    2. 创建一个OSSClient对象,用于连接到OSS服务。你需要提供Access Key ID、Access Key Secret和Endpoint等信息来进行身份验证和访问配置。

    String accessKeyId = "your_access_key_id";
    String accessKeySecret = "your_access_key_secret";
    String endpoint = "your_oss_endpoint";
    
    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
    1. 使用ListObjectsRequest来列举指定日期范围内的文件。你可以设置Prefix来指定目录路径,设置Delimiter来指定文件夹分隔符,设置Marker来实现分页查询,以及设置时间范围来过滤文件。
    String bucketName = "your_bucket_name";
    String prefix = "your_directory_path/";
    Date startDate = // 指定开始日期
    Date endDate = // 指定结束日期
    
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    String startKey = prefix + dateFormat.format(startDate);
    String endKey = prefix + dateFormat.format(endDate);
    
    ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName)
            .withPrefix(prefix)
            .withMarker(startKey)
            .withDelimiter("/")
            .withMaxKeys(1000);
    
    ObjectListing objectListing;
    do {
        objectListing = ossClient.listObjects(listObjectsRequest);
        for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
            String key = objectSummary.getKey();
            // 下载匹配的文件
            if (key.compareTo(startKey) >= 0 && key.compareTo(endKey) <= 0) {
                // 根据key下载文件到本地,可以使用GetObjectRequest和GetObjectResult实现
                // 可以参考阿里云OSS的官方文档或示例代码来完成下载操作
            }
        }
        listObjectsRequest.setMarker(objectListing.getNextMarker());
    } while (objectListing.isTruncated());
    
    1. 在循环中找到指定日期范围内的文件,并使用GetObjectRequest和GetObjectResult来下载文件。具体的下载操作可以参考阿里云OSS的官方文档或示例代码。

    2. 最后,记得在下载完成之后关闭OSSClient对象。

    ossClient.shutdown();
    
    2023-08-02 16:00:00
    赞同 1 展开评论 打赏
  • 发表文章、提出问题、分享经验、结交志同道合的朋友

    同学你好,这个需求实现可以换个思路:
    1、获取指定日期的文件列表,通过官方提供的列举文件接口获取桶中所有文件的列表,然后在本地筛选出符合指定日期范围的文件

    2、遍历文件列表下载,使用官方提供的下载文件接口将这些文件下载到本地。

    示例代码可以参考下:

         // 初始化OSS客户端
            OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    
            // 列举桶中所有文件
            ObjectListing objectListing = ossClient.listObjects(bucketName);
            List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
    
            // 根据日期条件筛选并下载文件
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            for (OSSObjectSummary objectSummary : objectSummaries) {
                Date fileDate = objectSummary.getLastModified();
                String fileDateStr = dateFormat.format(fileDate);
                if (fileDateStr.equals(targetDate)) {
                    String objectKey = objectSummary.getKey();
                    OSSObject ossObject = ossClient.getObject(bucketName, objectKey);
                    ossClient.getObject(new GetObjectRequest(bucketName, objectKey), new File(downloadFolderPath + objectKey));
                }
            }
    
    2023-08-02 14:54:12
    赞同 展开评论 打赏
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    您好,SDK本身并没有批量操作功能,如果希望多次循环调用某一个API,需要在本地通过程序实现。
    SDK不支持批量下载,若您需要可以尝试使用工具下载。
    原因分析:

    linux登录是读取环境配置文件的顺序如下

    /etc/profile
    ~/.bash_profile
    ~/.bash_login
    ~/.profile
    而项目组配置文件就/etc/profile,.bashrc两个,而忽视了对其他配置项的检查,前面配置的JAVA_HOME在~/.profile中覆盖了,导致了前面所描述的问题

    ~/.bash_profile在SUSE中这个文件命名为.bashrc

    解决方案:

    注释掉多余的环境变量配置

    2023-08-02 14:54:11
    赞同 展开评论 打赏
滑动查看更多

相关产品

  • 对象存储
  • 热门讨论

    热门文章

    相关电子书

    更多
    OSS运维进阶实战手册 立即下载
    《OSS运维基础实战手册》 立即下载
    OSS运维基础实战手册 立即下载