【问题标题】:Retrieving headers for streaming object using AWS SDK for PHP (v3)使用 AWS SDK for PHP (v3) 检索流对象的标头
【发布时间】:2019-10-16 23:57:41
【问题描述】:

AWS SDK for PHP 中的 guide exists for v2 用于从 S3 流式传输对象,如图像。在该指南中,它引用了 $command->getResponse()->getHeaders() - getResponse()getHeaders() 在 SDK 的 v3 中似乎都不存在。

documentation for the stream wrapper in v3 没有提及检索标头。我用s3:// 路径尝试了原生PHP get_headers(),但返回false(没有错误)。如果我尝试get_headers($fullurl),我可以检索标题。

对于适用于 PHP 的 AWS 开发工具包版本 3,如何使用流路径 s3:// 检索对象的标头?使用完整 URL 将适用于我有私人文件的情况。

运行文档引用的其他一些原生 PHP 函数确实使用 s3:// 路径正确返回值。标头可能有 SDK 方法调用,我就是找不到。

$s3->registerStreamWrapper();

$headers = get_headers('s3://my-files/' . $filepath);
//$headers === false

$headers = get_headers('http://my-files.s3.amazonaws.com/' . $filepath);
//$headers correctly retrieves all the headers

【问题讨论】:

    标签: php amazon-s3 http-headers aws-sdk aws-php-sdk


    【解决方案1】:

    v2 代码:

    $command = $s3->getCommand('HeadObject', [
        'Bucket' => $bucket,
        'Key'    => $key,
    ]);
    
    $headers = $command->getResponse()->getHeaders();
    

    v3 代码:

    $command = $s3->getCommand('HeadObject', [
        'Bucket' => $bucket,
        'Key'    => $key,
    ]);
    
    $result = $s3->execute($command);
    $headers = $result->get("@metadata")['headers'];
    

    这不是一个简单的替代品。数组键现在是小写的,因此您必须将 $headers['Last-Modified'] 之类的引用转换为 $headers['last-modified']

    我在文档中找不到这个。我看到了使用执行/结果的示例,所以我运行echo $result 来查看新结构并看到@metadata。它看起来像这样:

    {
        .........
        "@metadata": {
            "statusCode": 200,
            "effectiveUri": "https:\/\/example.s3.amazonaws.com\/example\/file.txt",
            "headers": {
                "x-amz-id-2": "",
                "x-amz-request-id": "",
                "date": "Tue, 15 Oct 2019 20:04:18 GMT",
                "x-amz-replication-status": "COMPLETED",
                "last-modified": "Tue, 15 Oct 2019 19:08:28 GMT",
                "etag": "",
                "x-amz-server-side-encryption": "AES256",
                "x-amz-version-id": "",
                "accept-ranges": "bytes",
                "content-type": "application\/octet-stream",
                "content-length": "32213",
                "server": "AmazonS3"
            },
            "transferStats": {
                "http": [[]]
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      一种解决方案似乎不是最有效的方法,但它确实有效 - 它可以解决get_headers($fullurl) 有效的事实。

      由于我们有时需要访问私人文件,我们可以get a presigned URL 为任何用户提供 URL 访问权限,然后运行 ​​get_headers() 关闭它。

      $s3getobject = $s3->getCommand('GetObject', [
          'Bucket' => 'my-files',
          'Key' => $filepath
      ]);
      $presignedrequest = $s3->createPresignedRequest($s3getobject, '+5 minutes');
      $s3url = (string) $presignedrequest->getUri();
      $headers = get_headers($s3url, true);
      

      【讨论】:

      • $headers = get_headers($s3url, true); 不会获取所有信息,例如内容类型。
      猜你喜欢
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2021-08-31
      • 2015-12-08
      • 2019-11-18
      • 1970-01-01
      • 2013-10-25
      相关资源
      最近更新 更多