45

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

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

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

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

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

4

4 回答 4

71

获取指定的 Amazon S3 对象是否存在于指定的存储桶中。

亚马逊S3doesObjectExist

$s3 = new AmazonS3();
$bucket = 'my-bucket' . strtolower($s3->key);

$response = $s3->doesObjectExist($bucket, 'test1.txt');

// Success? (Boolean, not a CFResponse object)
var_dump($response);
于 2012-09-10T10:51:42.333 回答
12

尝试使用下面的代码:

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

于 2014-12-03T02:33:19.883 回答
8

请注意,其他建议基于适用于 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!';
}
于 2014-11-08T17:44:18.883 回答
3

如果您有或有能力安装 PECL 扩展HTTP,那么您可以使用http_head轻松发出 head 请求并检查响应是 200 还是 404。

于 2012-06-01T01:35:22.793 回答