You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:45:43