95 votes

Vérifier la taille d'un fichier sur S3 sans le télécharger ?

J'ai des fichiers clients téléchargés sur Amazon S3, et j'aimerais ajouter une fonctionnalité permettant de compter la taille de ces fichiers pour chaque client. Existe-t-il un moyen de "jeter un coup d'œil" sur la taille des fichiers sans les télécharger ? Je sais que vous pouvez visualiser à partir du panneau de contrôle Amazon, mais je dois le faire de manière pro grammaticale.

2 votes

Avez-vous essayé une requête HEAD au lieu d'une requête GET ?

0 votes

Pourriez-vous afficher ce que votre HEAD request était, s'il vous plaît ? J'essaie également de faire cela et je ne sais pas comment m'y prendre.

1 votes

Consultez ma réponse ci-dessous, il existe un moyen plus simple d'utiliser le CLI.

74voto

Michael Dowling Points 1729

Envoyer un message HTTP TETE à l'objet. Une requête HEAD récupère les mêmes en-têtes HTTP qu'une requête GET, mais elle ne récupère pas le corps de l'objet (ce qui vous permet d'économiser de la bande passante). Vous pouvez ensuite analyser la valeur de l'en-tête Content-Length à partir des en-têtes de la réponse HTTP.

2 votes

Consultez ma réponse ci-dessous, il existe un moyen plus simple d'utiliser le CLI.

1 votes

Il est important de noter que ce n'est qu'à partir de décembre 2020 qu'Amazon a introduit un modèle fortement cohérent pour S3. Avant cela, un fichier téléchargé vers S3 n'était pas nécessairement disponible immédiatement, et une requête HEAD pouvait toujours échouer même après le téléchargement du fichier (pendant un laps de temps indéterminé).

59voto

Reegan Points 131

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

Doc est aquí .

0 votes

Consultez ma réponse ci-dessous, il existe un moyen plus simple d'utiliser le CLI.

55voto

Kyle Bridenstine Points 903

Vous pouvez simplement utiliser le s3 ls comando:

aws s3 ls s3://mybucket --recursive --human-readable --summarize

Sorties

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

Référence : https://docs.aws.amazon.com/cli/latest/reference/s3/ls.html

9voto

gil.fernandes Points 5581

Il s'agit d'une solution pour tous ceux qui utilisent Java et la bibliothèque S3 java fournie par Amazon. Si vous utilisez com.amazonaws.services.s3.AmazonS3 vous pouvez utiliser un GetObjectMetadataRequest qui permet d'interroger la longueur de l'objet.

Les bibliothèques que vous devez utiliser sont :

<!-- 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>

Importations :

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

Et le code dont vous avez besoin pour obtenir la longueur du contenu :

GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(bucketName, fileName);
final ObjectMetadata objectMetadata = s3Client.getObjectMetadata(metadataRequest);
long contentLength = objectMetadata.getContentLength();

Avant de pouvoir exécuter le code ci-dessus, vous devez construire le client S3. Voici un exemple de code pour cela :

AWSCredentials credentials = new BasicAWSCredentials(
            accessKey,
            secretKey
);
s3Client = AmazonS3ClientBuilder.standard()
            .withRegion(clientRegion)
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .build();

6voto

LennonR Points 583

En utilisant 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"]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X