J'ai des fichiers client téléchargés sur Amazon S3, et je voudrais ajouter une fonctionnalité pour compter la taille de ces fichiers pour chaque client. Y at-il un moyen de "jeter un coup d'oeil" dans la taille du fichier sans les télécharger? Je sais que vous pouvez le voir depuis le panneau de configuration d'Amazon, mais je dois le faire pro grammaticalement.Vérifiez la taille du fichier sur S3 sans le télécharger?
Répondre
Envoyer un HTTP HEAD demander à l'objet. Une requête HEAD récupérera les mêmes en-têtes HTTP qu'une requête GET, mais elle ne récupérera pas le corps de l'objet (ce qui vous permettra d'économiser de la bande passante). Vous pouvez ensuite analyser la valeur de l'en-tête Content-Length dans les en-têtes de réponse HTTP.
Vous pouvez également faire une liste du contenu du compartiment. Les métadonnées de la liste contiennent les tailles de fichier de tous les objets. C'est ainsi qu'il est implémenté dans le AWS SDK for PHP.
En utilisant les conseils de Michael, mon code avec succès 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"]
code PHP pour vérifier la taille de l'objet s3 (ou tout autre têtes d'objet), notez l'utilisation stream_context_set_default pour vous assurer qu'il utilise uniquement une requête 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'],'"');
solution Android
Intégrer aws sdk et vous obtenez une solution à peu près droite en avant:
// ... 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());
}
- Voici un lien vers le documentation officiel.
- Il est très important d'exécuter le code dans AsyncTask ou tout moyen de vous mettre dans un thread d'arrière-plan, sinon vous obtenez une exception pour l'exécution du réseau sur le thread ui.
Il existe une meilleure solution.
$info = $s3->getObjectInfo($yourbucketName, $yourfilename);
print $info['size'];
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");
}
Node.js un:
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 here.
que je fais quelque chose comme ça 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 Gb: ' + str(size/(1000**3)))
Avez-vous essayé une requête HEAD au lieu d'un GET? – Nick
Pourriez-vous poster ce que votre 'demande HEAD' était, s'il vous plaît? J'essaie aussi de le faire et je ne sais pas comment faire –