从S3存储桶获取文件大小

Ash*_*i K 6 java amazon-s3 amazon-web-services

我试图使用Amazon S3 JAVA sdk获取文件大小(内容长度).

public Long getObjectSize(AmazonS3Client amazonS3Client, String bucket, String key)
        throws IOException {
    Long size = null;
    S3Object object = null;
    try {
        object = amazonS3Client.getObject(bucket, key);
        size = object.getObjectMetadata().getContentLength();

    } finally {
        if (object != null) {
            //object.close();
            1. This results in 50 calls (connection pool size) post that I start getting connection pool errors. 
            2. If this line is uncommented it takes hell lot of time to make calls.
        }
    }
    return size;
}
Run Code Online (Sandbox Code Playgroud)

我跟着这个这个.但不确定我在这里做错了什么.对此有何帮助?

Mar*_*k B 11

我猜你的实际问题是什么,但我认为你可以通过做类似的事情来减少代码并消除创建s3Object的需要:

public Long getObjectSize(AmazonS3Client amazonS3Client, String bucket, String key)
        throws IOException {
    return amazonS3Client.getObjectMetadata(bucket, key).getContentLength();
}
Run Code Online (Sandbox Code Playgroud)

这应该消除了调用object.close()你似乎遇到问题的需要.

  • 也许最好使用getInstanceLenght()而不是getContentLenght(),因为如果您使用setRange()有选择地下载文件范围,则content length会为您提供请求的http内容长度,在这种情况下就是您的范围(例如,对于setRange(0,100),getContentLength()将返回100,而不是实际的文件大小) (2认同)

kc2*_*001 6

对于 Amazon S3 Java SDK v2,请尝试如下操作:

HeadObjectRequest headObjectRequest =
        HeadObjectRequest.builder()
          .bucket(bucket)
          .key(key)
          .build();
HeadObjectResponse headObjectResponse =
        s3Client.headObject(headObjectRequest);
Long contentLength = headObjectResponse.contentLength();
Run Code Online (Sandbox Code Playgroud)