Les fichiers client sont téléchargés sur Amazon S3 et je souhaite ajouter une fonctionnalité permettant de compter la taille de ces fichiers pour chaque client. Existe-t-il un moyen de "visualiser" la taille du fichier sans le télécharger? Je sais que vous pouvez afficher à partir du panneau de configuration Amazon, mais je dois le faire de manière grammaticale.
Envoyez une requête HTTPHEADà l'objet. Une demande HEAD récupérera les mêmes en-têtes HTTP qu'une demande GET, mais ne récupérera pas le corps de l'objet (en économisant votre bande passante). Vous pouvez ensuite analyser la valeur de l'en-tête Content-Length à partir des en-têtes de réponse HTTP.
En suivant les conseils de Michael, mon code réussi ressemblait à ceci:
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"]
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));
Doc est ici .
Je fais quelque chose comme ceci en Python pour obtenir la taille cumulée de tous les fichiers sous un préfixe donné:
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)))
Vous pouvez également faire une liste du contenu du seau. Les métadonnées de la liste contiennent les tailles de fichier de tous les objets. Voici comment il est implémenté dans le AWS SDK pour PHP .
AWS SDK for .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");
}
Intégrez aws sdk et vous obtenez une solution à peu près simple:
// ... 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());
}
Il y a une meilleure solution.
$info = $s3->getObjectInfo($yourbucketName, $yourfilename);
print $info['size'];
Code PHP pour vérifier la taille de l'objet s3 (ou tout autre en-tête d'objet), notez l'utilisation stream_context_set_default pour s'assurer qu'il utilise uniquement une demande 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'],'"');
Le code python suivant fournira la taille des 1000 meilleurs fichiers en les imprimant individuellement à partir de 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)