2

适用于 PHP的AWS 开发工具包v2 的指南可用于从S3 流式传输对象(如图像)。在该指南中,它引用了- SDK 的 v3中似乎不存在两者。$command->getResponse()->getHeaders()getResponse()getHeaders()

v3 中流包装器的文档没有提及检索标头。我已经get_headers()使用s3://路径尝试了本机 PHP,但是返回false(没有错误)。如果我尝试get_headers($fullurl),我可以检索标题。

如何使用s3://适用于 PHP 的 AWS 开发工具包版本 3 的流路径检索对象的标头?使用完整 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
4

2 回答 2

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": [[]]
        }
    }
}
于 2019-10-16T15:57:41.427 回答
-1

一种解决方案似乎不是最有效的方法,但它有效——它有效地解决了有效的事实get_headers($fullurl)

由于我们有时需要访问私有文件,因此我们可以获得一个预签名 URL,该 URL 将为任何用户提供 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);
于 2015-10-21T12:45:51.573 回答