【问题标题】:unable to display aws s3 object but downloads无法显示 aws s3 对象但下载
【发布时间】:2019-03-12 15:25:18
【问题描述】:

这里是 PHP/AWS S3 菜鸟:从事一个项目,我需要能够显示来自 AWS S3 存储桶的专辑插图以及播放音乐文件。我可以上传,但是在尝试查看图像时,它会下载。检查了内容类型和内容配置。我相信问题出在这段代码的 sn-p 上:我将不胜感激任何帮助/建议。

<?php
....
....
try {
$s3 = S3Client::factory(
  array(
    'credentials' => array(
      'key' => $IAM_KEY,
      'secret' => $IAM_SECRET
    ),
    'version' => 'latest',
    'region'  => 'us-east-2'
  )
);
//
$result = $s3->getObject(array(
  'Bucket' => $BUCKET_NAME,
  'Key'    => $keyPath
));
echo $result;
//exit();
// Display it in the browser
header("Content-Type: {$result['ContentType']}");
header('Content-Disposition: filename="' . basename($keyPath) . '"');
return $result['Body'];
} catch (Exception $e) {
   die("Error: " . $e->getMessage());
}
?>
<!DOCTYPE html>
<html>
  <head>
    <title>display image</title>
 </head>
 <body>
   <img src="<?php echo $result['body']; ?>">
 </body>
</html>

【问题讨论】:

  • 你试过file_get_contents()吗?您的存储桶是否对所有非您的身份验证用户具有查看权限?
  • 是的,我有@Joshua,但没用。我可以访问存储桶并访问内容,但不是在浏览器上显示,而是将其下载到我的桌​​面
  • @Bonsa 旁注,您这样做很困难,将内容下载到服务器上并将它们返回到浏览器,这会不必要地占用服务器资源。您可以只生成一个有效期较短的预签名 URL 并将浏览器重定向到该 URL,从而允许浏览器使用签名 URL 提供的授权直接从 S3 获取。
  • 另外,echo $result; 似乎有问题。这不会将结果对象发送到浏览器吗? (我的 php 有点生疏了。)你说 “已经检查了内容类型和内容配置”——你在哪里检查的?在浏览器看到的响应头中?你为什么要返回Content-Disposition?在尝试查看而不是下载对象时,什么应该是不必要的,并且可能没有帮助。

标签: php amazon-web-services amazon-s3


【解决方案1】:

引自this answer

您可以从 S3 下载内容(在 PHP 脚本中),然后使用正确的标头提供它们。

作为一个粗略的例子,假设您在 image.php 中有以下内容:

$s3 = new AmazonS3();
$response = $s3->get_object($bucket, $image_name);
if (!$response->isOK()) {
    throw new Exception('Error downloading file from S3');
}
header("Content-Type: image/jpeg");
header("Content-Length: " . strlen($response->body));
die($response->body);
Then in your HTML code, you can do

<img src="image.php">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2022-11-06
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多