Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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

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
使用AWS SDK for PHP(v3)检索流对象的标题_Php_Amazon S3_Http Headers_Aws Sdk_Aws Php Sdk - Fatal编程技术网

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

使用AWS SDK for PHP(v3)检索流对象的标题,php,amazon-s3,http-headers,aws-sdk,aws-php-sdk,Php,Amazon S3,Http Headers,Aws Sdk,Aws Php Sdk,从S3流式处理对象(如图像)的方法。在该指南中,它引用了$command->getResponse()->getHeaders()。getResponse()和getHeaders()似乎都不存在于SDK的v3中 未引用检索标题。我用s3://路径尝试了本机PHP,但返回false(无错误)。如果我尝试获取标题($fullurl),我就能够检索标题 如何使用AWS SDK for PHP版本3的流路径s3://检索对象的标题?在我有私人文件的情况下,使用完整的URL是可行的 运行文档引用的其他一

从S3流式处理对象(如图像)的方法。在该指南中,它引用了
$command->getResponse()->getHeaders()
getResponse()
getHeaders()
似乎都不存在于SDK的v3中

未引用检索标题。我用
s3://
路径尝试了本机PHP,但返回
false
(无错误)。如果我尝试
获取标题($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

有一种解决方案似乎不是最有效的方法,但它是有效的——它的工作原理是
get\u headers($fullurl)
有效

因为我们有时需要访问私有文件,所以我们可以为任何具有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);

v2代码:

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

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

$result = $s3->execute($command);
$headers = $result->get("@metadata")['headers'];
v3代码:

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

$headers = $command->getResponse()->getHeaders();
$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": [[]]
        }
    }
}
$headers=get_headers($s3url,true)
不会获取所有信息,如内容类型。