Amazon s3 检查S3上的文件大小而不下载?
我已经将客户文件上传到AmazonS3,我想添加一个功能来计算每个客户的文件大小。有没有一种方法可以在不下载的情况下“窥视”文件大小?我知道您可以从Amazon控制面板查看,但我需要按语法进行查看。向对象发送HTTPHEAD请求。HEAD请求将检索与GET请求相同的HTTP头,但不会检索对象的主体(节省带宽)。然后,您可以从HTTP响应头解析出内容长度头值。您还可以列出bucket的内容。清单中的元数据包含所有对象的文件大小。这就是它在中的实现方式。根据Michael的建议,我成功的代码如下所示:Amazon s3 检查S3上的文件大小而不下载?,amazon-s3,Amazon S3,我已经将客户文件上传到AmazonS3,我想添加一个功能来计算每个客户的文件大小。有没有一种方法可以在不下载的情况下“窥视”文件大小?我知道您可以从Amazon控制面板查看,但我需要按语法进行查看。向对象发送HTTPHEAD请求。HEAD请求将检索与GET请求相同的HTTP头,但不会检索对象的主体(节省带宽)。然后,您可以从HTTP响应头解析出内容长度头值。您还可以列出bucket的内容。清单中的元数据包含所有对象的文件大小。这就是它在中的实现方式。根据Michael的建议,我成功的代码如下所示
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"]
检查s3对象大小(或任何其他对象头)的PHP代码,请注意其用法,以确保它只使用头请求
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'],'"');
安卓解决方案
集成后,您将得到一个非常直接的解决方案:
// ... 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());
}
/。。。把这个放在后台线程中
列表和摘要;
s3ObjectSummaries=s3.listObjects(registeredBucket).getObjectSummaries();
对于(int i=0;i
- 这里有一个官方网站的链接
- 在AsyncTask中执行代码或以任何方式进入后台线程非常重要,否则在ui线程上运行网络会出现异常
- 有更好的解决方案
$info = $s3->getObjectInfo($yourbucketName, $yourfilename);
print $info['size'];
----,
AmazonS3Client s3=新的AmazonS3Client();
空间使用(s3,“putBucketNameHere”);
使用静态void space(AmazonS3Client s3Client,字符串bucketName)
{
ListObjectsRequest请求=新建ListObjectsRequest();
request.BucketName=BucketName;
ListObjectsResponse-response=s3Client.ListObjects(请求);
长totalSize=0;
foreach(响应为s3o对象。S3Objects)
{
总尺寸+=o.尺寸;
}
Console.WriteLine(“bucket的总大小”+bucketName+“为”+
数学四舍五入(totalSize/1024.0/1024.0,2)+“MB”);
}
Node.js示例:
const AWS=require('AWS-sdk');
const s3=新的AWS.s3();
函数sizeOf(键、桶){
返回s3.headObject({Key:Key,Bucket:Bucket})
.承诺
。然后(res=>res.ContentLength);
}
//测验
sizeOf('ahihi.mp4','output')。然后(size=>console.log(size));
Doc是。我在Python中执行类似操作,以获取给定前缀下所有文件的累积大小:
导入boto3
bucket='您的bucket名称'
前缀='some/s3/prefix/'
s3=boto3.client('s3')
大小=0
结果=s3。列出对象(Bucket=Bucket,Prefix=Prefix)
大小+=总和([x['size']表示结果['Contents']]中的x)
结果['IsTruncated']时:
结果=s3.list\u对象\u v2(
Bucket=Bucket,Prefix=Prefix,
ContinuationToken=结果['NextContinuationToken'])
大小+=总和([x['size']表示结果['Contents']]中的x)
打印('以MB为单位的总大小:'+str(大小/(1000**2)))
以下python代码将提供从s3单独打印的前1000个文件的大小:
导入boto3
bucket='bucket\u name'
前缀='prefix'
s3=boto3.client('s3')
contents=s3.列出对象(Bucket=Bucket,MaxKeys=1000,Prefix=Prefix)['contents']
对于目录中的c:
print('Size(KB):',float(c['Size'])/1000)
这是一个解决方案,适用于使用Java和Amazon提供的S3 Java库的用户。如果您使用的是com.amazonaws.services.s3.AmazonS3
,则可以使用GetObjectMetadataRequest
请求来查询对象长度
您必须使用的库包括:
<!-- 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>
以及获取内容长度所需的代码:
GetObjectMetadataRequest metadataRequest = new GetObjectMetadataRequest(bucketName, fileName);
final ObjectMetadata objectMetadata = s3Client.getObjectMetadata(metadataRequest);
long contentLength = objectMetadata.getContentLength();
在执行上述代码之前,您需要构建S3客户机。下面是一些示例代码:
AWSCredentials credentials = new BasicAWSCredentials(
accessKey,
secretKey
);
s3Client = AmazonS3ClientBuilder.standard()
.withRegion(clientRegion)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
您只需使用
s3 ls
命令即可:
aws s3 ls s3://mybucket --recursive --human-readable --summarize
输出
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
参考资料:golange示例,同样的原理,再次运行head请求有问题的对象:
func returnKeySizeInMB(bucketName string, key string) {
output, err := svc.HeadObject(
&s3.HeadObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(key),
})
if err != nil {
log.Fatalf("Unable to to send head request to item %q, %v", e.Detail.RequestParameters.Key, err)
}
return int(*output.ContentLength / 1024 / 1024)
}
AWS C++解决方案获得文件大小< /p>
//! Step 1: create s3 client
Aws::S3::S3Client s3Client(cred, config); //!Used cred & config,You can use other options.
//! Step 2: Head Object request
Aws::S3::Model::HeadObjectRequest headObj;
headObj.SetBucket(bucket);
headObj.SetKey(key);
//! Step 3: read size from object header metadata
auto object = s3Client.HeadObject(headObj);
if (object.IsSuccess())
{
fileSize = object.GetResultWithOwnership().GetContentLength();
}
else
{
std::cout << "Head Object error: "
<< object .GetError().GetExceptionName() << " - "
<< object .GetError().GetMessage() << std::endl;
}
/!步骤1:创建s3客户端
Aws::S3::S3客户端S3客户端(cred,config);/!使用cred&config,您可以使用其他选项。
//! 步骤2:头对象请求
Aws::S3::Model::HeadObjectRequest headObj;
头体立根盒(铲斗);
头对象设置键(键);
//! 步骤3:从对象头元数据读取大小
auto object=s3Client.HeadObject(headObj);
if(object.issucess())
{
fileSize=object.GetResultWithOwnership().GetContentLength();
}
其他的
{
std::coutRuby带有head\u对象的解决方案:
您是否尝试了HEAD请求而不是GET?请发布您的HEAD请求是什么,好吗?我也在尝试这样做,但不确定如何执行此操作检查我下面的答案,使用CLI有一种更简单的方法。最后一行不应该是MB,而不是MB。因为['size'返回的大小是MB吗是字节,不是位?检查我下面的答案,使用CLI有一种更简单的方法。需要注意的是,直到2020年12月,Amazon才为S3引入了一种高度一致的模型。在此之前,上传到S3的文件不一定立即可用,即使上传了文件,HEAD请求也可能失败(对于不确定的时间量)检查下面的我的答案有一种更简单的使用CLI的方法。
//! Step 1: create s3 client
Aws::S3::S3Client s3Client(cred, config); //!Used cred & config,You can use other options.
//! Step 2: Head Object request
Aws::S3::Model::HeadObjectRequest headObj;
headObj.SetBucket(bucket);
headObj.SetKey(key);
//! Step 3: read size from object header metadata
auto object = s3Client.HeadObject(headObj);
if (object.IsSuccess())
{
fileSize = object.GetResultWithOwnership().GetContentLength();
}
else
{
std::cout << "Head Object error: "
<< object .GetError().GetExceptionName() << " - "
<< object .GetError().GetMessage() << std::endl;
}
require 'aws-sdk-s3'
s3 = Aws::S3::Client.new(
region: 'us-east-1', #or any other region
access_key_id: AWS_ACCESS_KEY_ID,
secret_access_key: AWS_SECRET_ACCESS_KEY
)
res = s3.head_object(bucket: bucket_name, key: object_key)
file_size = res[:content_length]