web-dev-qa-db-ja.com

ダウンロードせずにS3のファイルサイズを確認しますか?

Amazon S3にアップロードした顧客ファイルを持っているので、顧客ごとにそれらのファイルのサイズをカウントする機能を追加したいと思います。ダウンロードせずにファイルサイズを「覗く」方法はありますか?アマゾンのコントロールパネルから表示できることは知っていますが、プログラムでそれを行う必要があります。

42
ycseattle

オブジェクトにHTTP [〜#〜] head [〜#〜]リクエストを送信します。 A HEADリクエストは、GETリクエストと同じHTTPヘッダーを取得しますが、オブジェクトの本文は取得しません(帯域幅を節約します)。その後、Content-Lengthヘッダー値を解析できます。 HTTP応答ヘッダーから。

43
Michael Dowling

Node.jsの例:

const AWS = require('aws-sdk');
const s3 = new AWS.S3();

function sizeOf(key, bucket) {
    return s3.headObject({ Key: key, Bucket: bucket })
        .promise()
        .then(res => res.ContentLength);
}


// A test
sizeOf('ahihi.mp4', 'output').then(size => console.log(size));

Docは here です。

15
Ninh Pham

Michaelのアドバイスを使用すると、私の成功したコードは次のようになります。

require 'net/http'
require 'uri'

file_url = MyObject.first.file.url

url = URI.parse(file_url)
req = Net::HTTP::Head.new url.path
res = Net::HTTP.start(url.Host, url.port) {|http|
  http.request(req)
}

file_length = res["content-length"]
6
LennonR

。NET AWS SDK ---- ListObjectsRequestListObjectsResponseS3Object

AmazonS3Client s3 = new AmazonS3Client();
SpaceUsed(s3, "putBucketNameHere");

static void SpaceUsed(AmazonS3Client s3Client, string bucketName)
    {
        ListObjectsRequest request = new ListObjectsRequest();
        request.BucketName = bucketName;
        ListObjectsResponse response = s3Client.ListObjects(request);
        long totalSize = 0;
        foreach (S3Object o in response.S3Objects)
        {
            totalSize += o.Size;
        }
        Console.WriteLine("Total Size of bucket " + bucketName + " is " +
            Math.Round(totalSize / 1024.0 / 1024.0, 2) + " MB");
    }
4
Stephen Cernota

私はPython=でこのようなことをし、与えられたプレフィックスの下のすべてのファイルの累積サイズを取得します:

import boto3

bucket = 'your-bucket-name'
prefix = 'some/s3/prefix/'

s3 = boto3.client('s3')

size = 0

result = s3.list_objects_v2(Bucket=bucket, Prefix=prefix)
size += sum([x['Size'] for x in result['Contents']])

while result['IsTruncated']:
    result = s3.list_objects_v2(
        Bucket=bucket, Prefix=prefix,
        ContinuationToken=result['NextContinuationToken'])
    size += sum([x['Size'] for x in result['Contents']])

print('Total size in MB: ' + str(size / (1000**2)))
3
matt2000

s3 lsコマンド:

aws s3 ls s3://mybucket --recursive --human-readable --summarize

アウトプット

2013-09-02 21:37:53   10 Bytes a.txt
2013-09-02 21:37:53  2.9 MiB foo.Zip
2013-09-02 21:32:57   23 Bytes foo/bar/.baz/a
2013-09-02 21:32:58   41 Bytes foo/bar/.baz/b
2013-09-02 21:32:57  281 Bytes foo/bar/.baz/c
2013-09-02 21:32:57   73 Bytes foo/bar/.baz/d
2013-09-02 21:32:57  452 Bytes foo/bar/.baz/e
2013-09-02 21:32:57  896 Bytes foo/bar/.baz/hooks/bar
2013-09-02 21:32:57  189 Bytes foo/bar/.baz/hooks/foo
2013-09-02 21:32:57  398 Bytes z.txt

Total Objects: 10
   Total Size: 2.9 MiB

リファレンス: https://docs.aws.Amazon.com/cli/latest/reference/s3/ls.html

3

これは、JavaおよびS3 Javaライブラリを使用している場合のソリューションです。com.amazonaws.services.s3.AmazonS3を使用している場合は、GetObjectMetadataRequestリクエストにより、オブジェクトの長さを照会できます。

使用する必要があるライブラリは次のとおりです。

<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-Java-sdk-s3 -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-Java-sdk-s3</artifactId>
    <version>1.11.511</version>
</dependency>

輸入:

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

そして、コンテンツの長さを取得するために必要なコード:

GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(bucketName, fileName);
final ObjectMetadata objectMetadata = s3Client.getObjectMetadata(metadataRequest);
long contentLength = objectMetadata.getContentLength();

上記のコードを実行する前に、S3クライアントをビルドする必要があります。そのためのコードの例を以下に示します。

AWSCredentials credentials = new BasicAWSCredentials(
            accessKey,
            secretKey
);
s3Client = AmazonS3ClientBuilder.standard()
            .withRegion(clientRegion)
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .build();
2
gil.fernandes

バケットの内容のリストを作成することもできます。リストのメタデータには、すべてのオブジェクトのファイルサイズが含まれています。 AWS SDK for PHP での実装方法です。

1
Ryan Parman

Androidソリューション

統合 aws sdk すると、かなり簡単な解決策が得られます。

// ... put this in background thread
List<S3ObjectSummary> s3ObjectSummaries;
s3ObjectSummaries = s3.listObjects(registeredBucket).getObjectSummaries();
for (int i = 0; i < s3ObjectSummaries.size(); i++) {
    S3ObjectSummary s3ObjectSummary = s3ObjectSummaries.get(i);
    Log.d(TAG, "doInBackground: size " + s3ObjectSummary.getSize());
}
  • ここに公式の ドキュメント へのリンクがあります。
  • AsyncTaskまたは任意の手段でコードを実行してバックグラウンドスレッドで実行することが非常に重要です。それ以外の場合は、UIスレッドでネットワークを実行すると例外が発生します。
1
hannunehg

より良い解決策があります。

$info = $s3->getObjectInfo($yourbucketName, $yourfilename);
print $info['size'];
1
Ronak Patel

golangの例、同じ原則、問題のオブジェクトをもう一度ヘッドリクエストを実行します。

func returnKeySizeInMB(bucketName string, key string) {
    output, err := svc.HeadObject(
        &s3.HeadObjectInput{
            Bucket: aws.String(bucketName),
            Key:    aws.String(key),
        })
    if err != nil {
        log.Fatalf("Unable to to send head request to item %q, %v", e.Detail.RequestParameters.Key, err)
    }

    return int(*output.ContentLength / 1024 / 1024)
}
0
Jonny Rimek

S3オブジェクトのサイズ(またはその他のオブジェクトヘッダー)をチェックするPHPコード、使用 stream_context_set_default がHEADリクエストのみを使用していることを確認する

stream_context_set_default(
            array(
                'http' => array(
                    'method' => 'HEAD'
                )
            )
        );

$headers = get_headers('http://s3.amazonaws.com/bucketname/filename.jpg', 1);
$headers = array_change_key_case($headers); 

$size = trim($headers['content-length'],'"'); 

次のpythonコードは、s3から個別に印刷する上位1000ファイルのサイズを提供します。

import boto3

bucket = 'bucket_name'
prefix = 'prefix'

s3 = boto3.client('s3')
contents = s3.list_objects_v2(Bucket=bucket,  MaxKeys=1000, Prefix=prefix)['Contents']

for c in contents:
    print('Size (KB):', float(c['Size'])/1000)
0
tahir siddiqui