如何使用PHP在网站上展示AWS S3存储桶中的图片或视频文件
解决PHP展示AWS S3存储桶图片的问题
你代码里的核心问题是:在<img>标签中直接使用了$result变量,它是listObjects方法的返回集合,并不是图片的可访问URL,所以图片无法加载。下面提供两种可行的实现方案:
方案1:生成预签名URL(适配私有存储桶)
如果你的S3桶是默认私有权限,需要生成带有效期的预签名URL来临时授权访问图片,AWS SDK内置了相关方法:
require './vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; // AWS配置信息 $bucketName = '#'; $IAM_KEY = '#'; $IAM_SECRET = '#'; // 连接AWS S3 try { $s3 = S3Client::factory([ 'credentials' => [ 'key' => $IAM_KEY, 'secret' => $IAM_SECRET, ], 'version' => 'latest', 'region' => 'eu-west-2' ]); } catch (Exception $e) { die("Error: " . $e->getMessage()); } $result = $s3->listObjects(['Bucket' => $bucketName]); echo "Keys retrieved!\n"; foreach ($result['Contents'] as $object) { $objectKey = $object['Key']; echo $objectKey . "\n"; // 生成有效期1小时的预签名URL $command = $s3->getCommand('GetObject', [ 'Bucket' => $bucketName, 'Key' => $objectKey ]); $presignedUrl = $s3->createPresignedRequest($command, '+1 hour')->getUri(); // 输出图片标签,用htmlspecialchars防止XSS echo '<img src="' . htmlspecialchars($presignedUrl) . '" alt="' . htmlspecialchars($objectKey) . '"><br>'; }
方案2:直接使用公共对象URL(适配开启公共读权限的桶)
如果你的S3桶或目标对象已经配置了公共读权限,可以直接拼接固定格式的公共URL:
require './vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; // AWS配置信息 $bucketName = '#'; $IAM_KEY = '#'; $IAM_SECRET = '#'; // 连接AWS S3 try { $s3 = S3Client::factory([ 'credentials' => [ 'key' => $IAM_KEY, 'secret' => $IAM_SECRET, ], 'version' => 'latest', 'region' => 'eu-west-2' ]); } catch (Exception $e) { die("Error: " . $e->getMessage()); } $result = $s3->listObjects(['Bucket' => $bucketName]); echo "Keys retrieved!\n"; foreach ($result['Contents'] as $object) { $objectKey = $object['Key']; echo $objectKey . "\n"; // 拼接公共访问URL,用rawurlencode处理特殊字符 $publicUrl = "https://{$bucketName}.s3.eu-west-2.amazonaws.com/" . rawurlencode($objectKey); // 输出图片标签 echo '<img src="' . htmlspecialchars($publicUrl) . '" alt="' . htmlspecialchars($objectKey) . '"><br>'; }
关键注意事项
- 预签名URL的有效期可自定义,比如
'+30 minutes'或'+2 days' - 拼接公共URL时,必须用
rawurlencode()处理对象Key,避免特殊字符导致URL失效 - 私有桶禁止使用方案2,否则会返回访问拒绝错误
内容的提问来源于stack exchange,提问作者Sprite
相关产品推荐
相关产品推荐

