使用 PHP 查看 S3 中是不是存在对象
Posted
技术标签:
【中文标题】使用 PHP 查看 S3 中是不是存在对象【英文标题】:Seeing if object exists in S3 using PHP使用 PHP 查看 S3 中是否存在对象 【发布时间】:2012-06-06 06:49:36 【问题描述】:我正在使用 php,并且我正在使用 S3 API 上传文件,但我想确保在上传之前该确切的文件名不存在于存储桶中。
我在网上找到了一些使用“file_get_contents”的示例,但这是否意味着您必须先下载整个文件?通常,这些文件大约 10 mb,所以理想情况下,我真的不想这样做。
有没有办法在不下载文件的情况下使用“file_get_contents”?
或者更好的是,也许我可以使用 API 请求来查看文件名是否存在?
内容或文件大小是否相同对我来说并不重要,只是文件名。
【问题讨论】:
【参考方案1】:获取指定存储桶中是否存在指定的 Amazon S3 对象。
AmazonS3 doesObjectExist
$s3 = new AmazonS3();
$bucket = 'my-bucket' . strtolower($s3->key);
$response = $s3->doesObjectExist($bucket, 'test1.txt');
// Success? (Boolean, not a CFResponse object)
var_dump($response);
【讨论】:
此链接和方法适用于适用于 PHP 的 AWS 开发工具包版本 1。更新的用户指南在这里:docs.aws.amazon.com/aws-sdk-php/latest/index.html 和检查文件存在的相关部分是使用流包装器,在这里找到:docs.aws.amazon.com/aws-sdk-php/guide/latest/… 更新文档的链接,具体方法为:docs.aws.amazon.com/aws-sdk-php/v2/api/… 正确使用的函数应该是$s3->doesObjectExist(...)
@BrianLeishman 感谢您指出这一点。我已经更新了答案。
链接到 v3 文档:docs.aws.amazon.com/aws-sdk-php/v3/api/…【参考方案2】:
尝试使用以下代码:
$s3 = new S3();
$info = $s3->getObjectInfo($bucket, $filename);
if ($info)
echo 'File exists';
else
echo 'File does not exists';
从亚马逊下载 S3 SDK for php。有一个类叫S3;创建 S3 的对象。该对象将允许调用 getObjectInfo() 方法。传递您的 S3 存储桶名称和文件名(通常文件名称为键)。如果文件存在,getObjectInfo() 方法将返回一些信息,否则该方法将返回 FALSE。
【讨论】:
一点解释会大大改善这个答案。它目前处于“低质量”审查队列中,可能是因为它主要由代码组成。 感谢您的评论。我只是解释了代码。 这应该是勾选的答案。最简单最好的。 您好,我有一个问题,上述方法是好的还是 PHP 的 @getimagesize($filename)) 是好的?上面的代码只会作为 GET 请求进行,对吗?但是 PHP 的 getimagesize 会吃掉带宽和 GET 请求,对吧? 我添加了文件名作为第二个参数,但它显示 Message: S3::getObjectInfo(portal-static-assets, x1.xls): [403] Unexpected HTTP status【参考方案3】:请注意,其他建议基于适用于 PHP 的 AWS 开发工具包版本 1。对于第 2 版,您需要熟悉此处的最新指南:
http://docs.aws.amazon.com/aws-sdk-php/guide/latest/index.html
以上链接中的“入门”部分将帮助您安装和设置 SDK,因此如果您还没有阅读这些文档,请务必花时间阅读。完成设置后,您需要熟悉此处的流包装器方法:
http://docs.aws.amazon.com/aws-sdk-php/guide/latest/feature-s3-stream-wrapper.html
最后,下面是一个简短的真实示例,说明如何在代码流中使用它。
require('vendor/autoload.php');
// your filename
$filename = 'my_file_01.jpg';
// this will use AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY from env vars
$s3 = Aws\S3\S3Client::factory();
// S3_BUCKET must also be defined in env vars
$bucket = getenv('S3_BUCKET')?: die('No "S3_BUCKET" config var in found in env!');
// register stream wrapper method
$s3->registerStreamWrapper();
// does file exist
$keyExists = file_exists("s3://".$bucket."/".$filename);
if ($keyExists)
echo 'File exists!';
【讨论】:
使用 v2 和 $s3->registerStreamWrapper(),file_exists("s3://".$bucket."/".$filename) 给我一个“PHP 致命错误:未捕获的 Aws\ S3\Exception\NoSuchKeyException:AWS 错误代码:NoSuchKey,状态代码:404" 而不是一个很好的真或假。看来我需要捕捉那个异常:(【参考方案4】:如果您有或有能力安装 PECL 扩展 HTTP,那么您可以使用 http_head 轻松发出 head 请求并检查响应是 200 还是 404。
【讨论】:
以上是关于使用 PHP 查看 S3 中是不是存在对象的主要内容,如果未能解决你的问题,请参考以下文章
Ansible CloudFormation模块无法查看S3对象