使用AWS SDK for PHP检索流对象的标头(v3)

时间:2015-10-21 12:16:13

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

guide exists for v2AWS SDK for PHP来自S3的流对象,如图像。在该指南中,它引用了$command->getResponse()->getHeaders() - SDK中v3似乎不存在getResponse()getHeaders()

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

如何使用AWS SDK for PHP版本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

2 个答案:

答案 0 :(得分:0)

一种解决方案似乎不是最有效的方式,但它有效 - 它可以解决get_headers($fullurl)工作的问题。

由于我们有时需要访问私有文件,因此get a presigned 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);

答案 1 :(得分:0)

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

我在文档中找不到此内容。我看到了使用execute / results的示例,因此我运行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": [[]]
        }
    }
}