使用PHP查看S3中是否存在对象

时间:2012-06-01 01:27:40

标签: php amazon-s3

我正在使用PHP而我正在使用S3 API上传文件,但我想确保在上传之前该存储桶中不存在这个确切的文件名。

我在网上找到了一些使用“file_get_contents”的例子,但是这不意味着你必须先下载整个文件吗?通常,这些文件大约是10 MB,所以理想情况下,我真的不想这样做。

有没有办法在不下载文件的情况下使用“file_get_contents”?

或者更好的是,也许我可以使用API​​请求来查看文件名是否存在?

对我而言,内容或文件大小是否相同只是文件名并不重要。

4 个答案:

答案 0 :(得分:46)

获取指定存储桶中是否存在指定的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);

答案 1 :(得分:8)

尝试使用以下代码:

$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。

答案 2 :(得分:6)

请注意,其他建议基于AWS SDK for PHP的第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!';
}

答案 3 :(得分:3)

如果您已经或有能力安装PECL分机HTTP,那么您可以使用http_head轻松提出头部请求并检查响应是200还是404.