У меня есть файлы клиентов, загруженные в Amazon S3, и я хотел бы добавить функцию, чтобы подсчитать размер этих файлов для каждого клиента. Есть ли способ "заглянуть" в размер файла, не загружая их? Я знаю, что вы можете просматривать с панели управления Amazon, но мне нужно сделать это программно.
Проверить размер файла на S3 без загрузки?
Ответ 1
Отправьте HTTP-запрос HEAD. Запрос HEAD будет получать те же HTTP-заголовки, что и запрос GET, но он не будет извлекать тело объекта (сохраняя вашу полосу пропускания). Затем вы можете проанализировать значение заголовка Content-Length из заголовков ответов HTTP.
Ответ 2
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));
Док здесь.
Ответ 3
Используя совет Майкла, мой успешный код выглядел так:
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"]
Ответ 4
Я делаю что-то вроде этого в 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)))
Ответ 5
Вы также можете сделать список содержимого ведра. Метаданные в листинге содержат размеры файлов всех объектов. Вот как это реализовано в AWS SDK для PHP.
Ответ 6
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.
Ответ 7
Существует лучшее решение.
$info = $s3->getObjectInfo($yourbucketName, $yourfilename);
print $info['size'];
Ответ 8
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");
}
Ответ 9
PHP-код для проверки размера объекта s3 (или любых других заголовков объектов), обратите внимание на использование 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'],'"');
Ответ 10
Следующий код 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)
Ответ 11
Это решение для тех, кто использует 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();
Ответ 12
Вы можете просто использовать команду 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.