在没有下载的情况下检查S3上的文件大小?
问题描述:
我将客户文件上传到Amazon S3,并且我想添加一项功能来计算每个客户的文件大小。有没有办法在不下载文件的情况下“偷看”文件大小?我知道你可以从亚马逊控制面板查看,但我需要在语法上做到这一点。在没有下载的情况下检查S3上的文件大小?
答
向对象发送HTTP HEAD请求。 HEAD请求将检索与GET请求相同的HTTP标头,但它不会检索对象的主体(节省带宽)。然后,您可以从HTTP响应标头中解析出Content-Length标头值。
答
利用迈克尔的建议下,我成功的代码是这样的:
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)))
您已经尝试了HEAD请求,而不是得到什么? – Nick 2010-10-11 21:47:06
你可以发布你的'HEAD请求'了吗?我也试图做到这一点,我不确定如何做到这一点 – 2012-08-01 17:44:42