2010-10-11 11 views
17

Tengo archivos de clientes cargados en Amazon S3, y me gustaría agregar una función para contar el tamaño de esos archivos para cada cliente. ¿Hay alguna manera de "echar un vistazo" al tamaño del archivo sin descargarlo? Sé que se puede ver desde el panel de control de Amazon, pero tengo que hacerlo pro gramaticalmente.¿Comprueba el tamaño del archivo en S3 sin descargarlo?

+2

¿Ha probado una petición HEAD en lugar de un GET? – Nick

+0

¿Podría publicar lo que fue su solicitud 'HEAD', por favor? También estoy tratando de hacer esto y no estoy seguro de cómo hacer esto –

Respuesta

21

Enviar un HTTP HEAD solicitud al objeto. Una solicitud HEAD recuperará los mismos encabezados HTTP que una solicitud GET, pero no recuperará el cuerpo del objeto (lo que le ahorrará ancho de banda). A continuación, puede analizar el valor del encabezado Content-Length desde los encabezados de respuesta HTTP.

2

También puede hacer una lista de los contenidos del depósito. Los metadatos en la lista contienen los tamaños de archivo de todos los objetos. Así es como se implementa en el AWS SDK for PHP.

5

Consejo de utilización de Michael, mi código de éxito era la siguiente:

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"] 
0

código PHP para comprobar el tamaño del objeto s3 (o cualquier otro cabeceras de objetos), observe el uso stream_context_set_default para asegurarse de que sólo se utiliza una petición 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

solución Android

Integrar aws sdk y se obtiene una solución recta hacia adelante más o menos:

// ... 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()); 
} 
  • Aquí hay un enlace a la documentation oficial.
  • Muy importante para ejecutar el código en AsyncTask o cualquier otro medio para obtener una secuencia de fondo, de lo contrario obtendrá una excepción para ejecutar la red en el hilo de la interfaz de usuario.
0

Hay una mejor solución.

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

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"); 
    } 
0

Node.js uno:

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 es here.

0

hago algo como esto en Python para obtener el tamaño acumulado de todos los archivos con un prefijo dado:

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))) 
Cuestiones relacionadas