web-dev-qa-db-fra.com

Vérifier la taille du fichier sur S3 sans télécharger?

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.

24
ycseattle

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.

28
Michael Dowling

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"]
6
LennonR

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 .

5
Ninh Pham

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)))
2
matt2000

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 .

1
Ryan Parman

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");
    }
1
Stephen C

Solution Android

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());
}
  • Voici un lien vers le document officiel documentation .
  • Il est très important d’exécuter le code dans AsyncTask ou tout moyen de vous placer dans un thread en arrière-plan, sinon vous obtenez une exception pour l’exécution du réseau sur un thread ui.
1
hannunehg

Il y a une meilleure solution.

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

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'],'"'); 
0

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)
0
tahir siddiqui