【问题标题】:AWS S3 file search using Java使用 Java 进行 AWS S3 文件搜索
【发布时间】:2012-03-14 19:22:36
【问题描述】:

我们使用 java 类从 AWS s3 存储桶下载文件,代码如下

inputStream = AWSFileUtil.getInputStream(
            AWSConnectionUtil.getS3Object(null),
            "cdn.generalsentiment.com", filePath);

AWSFileUtil 是一个检查凭证并使用 getInputStream 方法从 S3bucket 获取输入流的类。filePath 是 cdn.generalsentiment.com 存储桶中的文件。

我们想编写一个方法,它可以检查特定文件是否存在于 AWS S3 存储桶中,并返回一个布尔值或其他值。

请给我一个解决方案。

public static boolean isValidFile(AmazonS3 s3,
        String bucketName,
        String path) throws AmazonClientException {
    try {
        ObjectMetadata objectMetadata =  
s3.getObjectMetadata("cdn.generalsentiment.com", path);
    } catch (NotFoundException nfe) {
        nfe.printStackTrace();
    }

    return true;
}

如果文件存在,则返回 true,否则抛出 NotFoundException,我想捕获它并将“isValidFile”方法结果返回为 false。 伙计们,方法体或返回类型的任何其他替代方案都会很棒。

更新的一个

public static boolean doesFileExist(AmazonS3 s3,
        String bucketName,
        String path) throws AmazonClientException,
        AmazonServiceException {
    boolean isValidFile = true;
    try {
        ObjectMetadata objectMetadata = 
s3.getObjectMetadata("cdn.generalsentiment.com", path);

    } catch (NotFoundException nfe) {
        isValidFile = false;
    }
   catch (Exception exception) {
        exception.printStackTrace();
        isValidFile = false;
    }
    return isValidFile;
}

【问题讨论】:

    标签: java amazon-s3


    【解决方案1】:

    使用 GET Bucket S3 API:

    http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html

    并指定完整的文件名作为前缀。

    【讨论】:

      【解决方案2】:

      Daan's answer 使用GET Bucket (List Objects)(通过AWS for Java 中的相应包装器,见下文)是一次获取许多对象所需信息的最有效方法(+1),您需要发布当然相应地处理响应。

      这很容易通过Class AmazonS3Client 的相应方法之一完成,例如listObjects(String bucketName):

      AmazonS3 s3 = new AmazonS3Client(); // provide credentials, if need be
      ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
              .withBucketName("cdn.generalsentiment.com");
      for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
          System.out.println(objectSummary.getKey());
      }
      

      另类

      如果您一次只对单个对象(文件)感兴趣,使用HEAD Object 会更有效,因为您可以直接从相应的 HTTP 响应代码推断存在(参见Error Responses for details),即@ 987654328@ 响应 NoSuchKey - 指定的密钥不存在

      同样,这通过Class AmazonS3Client 最容易完成,即getObjectMetadata(String bucketName, String key),例如:

      public static boolean isValidFile(AmazonS3 s3,
              String bucketName,
              String path) throws AmazonClientException, AmazonServiceException {
          boolean isValidFile = true;
          try {
              ObjectMetadata objectMetadata = s3.getObjectMetadata(bucketName, path);
          } catch (AmazonS3Exception s3e) {
              if (s3e.getStatusCode() == 404) {
              // i.e. 404: NoSuchKey - The specified key does not exist
                  isValidFile = false;
              }
              else {
                  throw s3e;    // rethrow all S3 exceptions other than 404   
              }
          }
      
          return isValidFile;
      }
      

      【讨论】:

      • 哇,我什至不知道您可以将 HEAD 对象与实际对象分开获取。这绝对是一种更有效的方法来确定 S3 中是否存在单个文件。也为你 +1!
      • 哇!这解决了我的担心.. 非常感谢你们。顺便说一句,我在实际帖子中编辑的小异常处理案例,请引导我处理该异常
      • @SangramAnand:我已经包含并修改了您提供的功能以解决您的问题。
      • 非常感谢 Steffen 的演练...实际上该类没有处理 NotFoundException,它转到休眠事务类,然后抛出异常。我对代码进行了一些更改以解决此问题...如果代码好,请建议我。
      • @RTF - 有很多通用的,例如查看Constant Field Values;此外,您还会发现几个枚举,例如 EC2 instance types 等。
      【解决方案3】:

      这是在存储桶中查找现有文件夹的简单方法。上面的答案也是正确的。 文件夹名称最后包含“/”, 它返回 true 。

      注意:mybucket/userProfileModule/abc.pdf,它是我的文件夹结构

          boolean result1 = s3client.doesObjectExist("mybucket", "userProfileModule/");
          System.out.println(result);
      

      【讨论】:

        猜你喜欢
        • 2020-08-06
        • 1970-01-01
        • 2018-07-26
        • 1970-01-01
        • 2012-12-27
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多