Проверить размер файла на S3 без скачивания? - PullRequest
30 голосов
/ 12 октября 2010

У меня есть файлы клиентов, загруженные в Amazon S3, и я хотел бы добавить функцию для подсчета размера этих файлов для каждого клиента.Есть ли способ «заглянуть» в размер файла, не загружая их?Я знаю, что вы можете просматривать с панели управления Amazon, но мне нужно сделать это на грамматической основе.

Ответы [ 11 ]

36 голосов
/ 12 октября 2010

Отправка HTTP HEAD запроса к объекту. Запрос HEAD будет получать те же заголовки HTTP, что и запрос GET, но не будет получать тело объекта (сохраняя вашу пропускную способность). Затем можно проанализировать значение заголовка Content-Length из заголовков ответа HTTP.

7 голосов
/ 23 мая 2017

Node.js one:

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));

Документ здесь .

6 голосов
/ 01 октября 2012

Используя совет Майкла, мой успешный код выглядел так:

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"]
2 голосов
/ 21 декабря 2017

Я делаю что-то подобное в 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)))
1 голос
/ 17 июня 2016

AWS SDK для .NET ---- ListObjectsRequest & ListObjectsResponse

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");
    }
1 голос
/ 08 июня 2016

Есть лучшее решение.

$info = $s3->getObjectInfo($yourbucketName, $yourfilename);
print $info['size'];
1 голос
/ 24 мая 2016

Android Solution

Интегрируйте 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 или любым способом, чтобы получить вас в фоновом потоке, в противном случае вы получите исключение для запуска сети в потоке пользовательского интерфейса.
1 голос
/ 13 октября 2010

Вы также можете сделать список содержимого корзины.Метаданные в списке содержат размеры файлов всех объектов.Вот как это реализовано в AWS SDK для PHP .

0 голосов
/ 07 марта 2019

Это решение для тех, кто использует Java и библиотеку Java S3, предоставляемую Amazon.Если вы используете 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();
0 голосов
/ 10 января 2019

Следующий код Python предоставит размер 1000 лучших файлов, печатающих их по отдельности из s3:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...