【问题标题】:Delete object or bucket in Amazon S3?删除 Amazon S3 中的对象或存储桶?
【发布时间】:2013-08-23 04:02:59
【问题描述】:

我创建了一个名为“照片”的新亚马逊存储桶。存储桶网址类似于:

www.amazons3.salcaiser.com/photos

现在我将包含文件的子文件夹上传到该存储桶中,例如

www.amazons3.salcaiser.com/photos/thumbs/file.jpg

我的问题是,thumbs/ 是假定为一个新存储桶还是一个对象?

那么如果我想删除整个thumbs/ 目录,我需要先删除其中的所有文件还是一次性删除所有文件?

【问题讨论】:

  • s3 中没有文件夹可以删除所有具有相同前缀的对象

标签: php object amazon-s3 bucket


【解决方案1】:

在您描述的情况下,“照片”是存储桶。 S3 没有子存储桶或目录。通过在对象 key 中使用斜杠来模拟目录。 “thumbs/file.jpg”是对象键,“thumbs/”将被视为键prefix

Dagon 的示例很好,并且使用 AWS SDK for PHP 的旧版本 1.x。但是,您可以使用最新的 2.4.x version AWS SDK for PHP 更轻松地完成此操作,其中包含用于删除多个对象的辅助方法。

<?php

// Include the SDK. This line depends on your installation method.
require 'aws.phar';

use Aws\S3\S3Client;

$s3 = S3Client::factory(array(
    'key'    => 'your-aws-access-key',
    'secret' => 'your-aws-secret-key',
));

// Delete the objects in the "photos" bucket with the a prefix of "thumbs/"
$s3->deleteMatchingObjects('photos', 'thumbs/');

【讨论】:

  • 这太棒了,你知道deleteMatchingObjects() 是向s3 发起多个还是单个请求吗?
  • 如果不执行多个请求,就不可能做到这一点。但是,它确实尝试通过在后台使用 S3 的 multi-object delete API 来尽可能少地执行此操作。
  • @JeremyLindblom 是否可以使用此方法和删除所有出现的密钥? IE。不同的前缀但相同的文件名。小/a.png , thumb/a.png , 大/a.png ?
  • 我认为方法签名中的正则表达式参数会起作用。公共函数 deleteMatchingObjects($bucket, $prefix = '', $regex = '', array $options = array()) ,太棒了。
  • 不知道,但我正在使用 phpsdk-v3,它不再工作了
【解决方案2】:
//Include s3.php file first in code

if (!class_exists('S3'))
            require_once('S3.php');
        //AWS access info
        if (!defined('awsAccessKey'))
            define('awsAccessKey', 'awsAccessKey');
        if (!defined('awsSecretKey'))
            define('awsSecretKey', 'awsSecretKey');
        //instantiate the class
        $s3 = new S3(awsAccessKey, awsSecretKey);

  if ($s3->deleteObject("bucketname", `filename`)) {
        echo 'deleted';
}
else
{
echo 'no file found';
}

【讨论】:

    【解决方案3】:

    找到一些用于“目录”删除的代码 sn-ps - 我没有写它们:

    PHP 5.3+:

    $s3 = new AmazonS3();
    
    $bucket = 'your-bucket';
    $folder = 'folder/sub-folder/';
    
    $s3->get_object_list($bucket, array(
        'prefix' => $folder
    ))->each(function($node, $i, $s3) {
        $s3->batch()->delete_object($bucket, $node);
    }, array($s3));
    $responses = $s3->batch()->send();
    
    var_dump($responses->areOK());
    

    旧 PHP 5.2.x:

    $s3 = new AmazonS3();
    
    
    $bucket = 'your-bucket';
    $folder = 'folder/sub-folder/';
    
    $s3->get_object_list($bucket, array(
        'prefix' => $folder
    ))->each('construct_batch_delete', array($s3));
    
    function construct_batch_delete($node, $i, &$s3)
    {
        $s3->batch()->delete_object($bucket, $node);
    }
    
    $responses = $s3->batch()->send();
    
    var_dump($responses->areOK());
    

    【讨论】:

    • 感谢您提供这段可爱的代码!从上面的代码我可以看到我需要列出并删除所有不是子文件夹的对象;)
    【解决方案4】:

    我已经在 Yii 中实现了这个,

    $aws = Yii::$app->awssdk->getAwsSdk();
    $s3 = $aws->createS3();
    $s3->deleteMatchingObjects('Bucket Name','object key');
    

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 2019-12-05
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2018-11-20
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多