Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 检查S3上的文件大小而不下载?_Amazon S3 - Fatal编程技术网

Amazon s3 检查S3上的文件大小而不下载?

Amazon s3 检查S3上的文件大小而不下载?,amazon-s3,Amazon S3,我已经将客户文件上传到AmazonS3,我想添加一个功能来计算每个客户的文件大小。有没有一种方法可以在不下载的情况下“窥视”文件大小?我知道您可以从Amazon控制面板查看,但我需要按语法进行查看。向对象发送HTTPHEAD请求。HEAD请求将检索与GET请求相同的HTTP头,但不会检索对象的主体(节省带宽)。然后,您可以从HTTP响应头解析出内容长度头值。您还可以列出bucket的内容。清单中的元数据包含所有对象的文件大小。这就是它在中的实现方式。根据Michael的建议,我成功的代码如下所示

我已经将客户文件上传到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]