AWS S3上传文件成功但调用GetObject报错无法在浏览器展示文件
问题原因
你的上传逻辑是先通过$s3->bucket('my-bucket-name')获取指定桶的资源对象,再调用putObject方法,符合AWS PHP SDK资源接口的调用规范,所以可以正常运行。
报错的核心原因是你在拉取文件时,直接在S3服务资源对象上调用了getObject方法,资源接口不支持直接在服务层调用该方法,必须先绑定对应的桶资源。你现在的报错属于方法调用方式错误,不是权限问题:如果是权限不足,返回的错误会是Access Denied类提示,和你当前的报错内容不符。
解决方案
方案1:和上传逻辑对齐,先获取桶资源再调用方法
修改aws_file_get函数代码如下:
function aws_file_get($key) { $aws = aws(); $s3 = $aws->s3; // 先实例化对应桶的资源对象 $bucket = $s3->bucket('my-bucket-name'); $result = $bucket->getObject([ 'Key' => $key ]); // 输出对象到浏览器 header("Content-Type: {$result['ContentType']}"); echo $result['Body']; }
方案2:通过S3客户端实例直接调用方法
如果不想先获取桶资源,可以调用SDK的客户端实例执行操作,代码如下:
function aws_file_get($key) { $aws = aws(); $s3 = $aws->s3; // 先获取S3客户端实例再调用getObject,需传入Bucket参数 $result = $s3->getClient()->getObject([ 'Bucket' => 'my-bucket-name', 'Key' => $key ]); // 输出对象到浏览器 header("Content-Type: {$result['ContentType']}"); echo $result['Body']; }
内容的提问来源于stack exchange,提问作者joanb
相关产品推荐
相关产品推荐

