在没有下载的情况下检查S3上的文件大小?

问题描述:

我将客户文件上传到Amazon S3,并且我想添加一项功能来计算每个客户的文件大小。有没有办法在不下载文件的情况下“偷看”文件大小?我知道你可以从亚马逊控制面板查看,但我需要在语法上做到这一点。在没有下载的情况下检查S3上的文件大小?

+2

您已经尝试了HEAD请求,而不是得到什么? – Nick 2010-10-11 21:47:06

+0

你可以发布你的'HEAD请求'了吗?我也试图做到这一点,我不确定如何做到这一点 – 2012-08-01 17:44:42

向对象发送HTTP HEAD请求。 HEAD请求将检索与GET请求相同的HTTP标头,但它不会检索对象的主体(节省带宽)。然后,您可以从HTTP响应标头中解析出Content-Length标头值。

您还可以执行存储桶内容的列表。列表中的元数据包含所有对象的文件大小。这是如何在AWS SDK for PHP中实施的。

利用迈克尔的建议下,我成功的代码是这样的:

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

PHP代码来检查S3对象的大小(或其它任何物体头),请注意使用stream_context_set_default,以确保它仅使用一个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'],'"'); 

Android解决方案

集成aws sdk,你会得到一个非常直接的解决方案:

// ... 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()); 
} 
  • 下面是官方documentation的链接。
  • 在AsyncTask中执行代码非常重要,或者在后台线程中执行代码,否则会在ui线程上运行网络时发生异常。

有更好的解决方案。

$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的一个:

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

文件是here

我做这样的事情在Python获得给定的前缀下的所有文件的累积大小:

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