【问题标题】:Delete multiple objects Amazon s3 PHP SDK删除多个对象 Amazon s3 PHP SDK
【发布时间】:2014-01-09 09:25:05
【问题描述】:

我在一次删除多个对象时遇到问题..

使用这个库- https://github.com/aws/aws-sdk-php-laravel - 我对使用该库的其他任何事情没有任何问题(放置、获取、删除单个对象等)

try {
        $s3 = AWS::get('s3');
        $s3->deleteObjects(array(
            'Bucket'  => $bucket,
            'Objects' => $json['attachmentArray']
        ));
        return "Success deleting files.";
    } catch (S3Exception $e) {
        return "There was an error.\n";
    }

deleteObjects Amazon Docs-http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingPHPSDK.html

我收到了"Success deleting files."; 的回复,但文件并未被删除。

我的存储桶名称是正确的,并且根据文档,$json['attachmentArray'] 的格式是正确的(同样,我对 put、get、delete 等其他区域没有任何问题)

谁能指出我在哪里搞砸了? 谢谢。

编辑:

试图提供更多信息:

我正在将来自 Angular 函数的信息发布到 Laravel 端点。

这里是 Angular 函数(Firebase URL 隐藏):

$scope.deleteFile = function() {

  var r=confirm("Are you sure you want to delete this task & of it's all attachments?");
  if (r==true)
    {
      var attachmentArray = [];

      var atttachData = new Firebase('https://*.firebaseio.com/attachments');
        atttachData.on('value', function(dataSnapshot) {  
           dataSnapshot.forEach(function(childSnapshot) {
            var key   = childSnapshot.val().key;
            // attachmentArray.push(key); I tried this
               attachmentArray.push({Key:key});

            });
           });
                method: "POST",
                url: '/delete_task',
                data: {attachmentArray:attachmentArray},
                headers: {'Content-Type': 'application/json'},
           }).success(function(data){
              console.log(data);
           });
    } 
}

这是我正在尝试制作 deleteObjects 的 Laravel 控制器(使用来自@Kevin Florida 的更新代码:

 public function delete_task() {
    $request = Request::instance();
    $task = $request->getContent(); 
    $json = json_decode($task, TRUE); 
    $bucket ='bucketname/team1';

    // return $json['attachmentArray'];
    $s3 = AWS::get('s3');
    if(!$s3->deleteObjects(array(
                'Bucket'  => $bucket,
                'Objects' => $json['attachmentArray']
            ))) {
     return "error";
    } else {
     return "success";
    }
}

现在这会返回 500 服务器错误。我想我的 $json['attachmentArray']; 格式不正确?不确定;/

编辑2:

角函数

$scope.deleteFile = function() {

  var r=confirm("Are you sure you want to delete this task & of it's all attachments?");
  if (r==true)
    {
      var attachmentArray = [];

      var atttachData = new Firebase('https://***/attachments');
        atttachData.on('value', function(dataSnapshot) {  
           dataSnapshot.forEach(function(childSnapshot) {
            var url   = childSnapshot.val().url;
            var name  = childSnapshot.val().name;
            var id    = childSnapshot.val().id;
            var key   = childSnapshot.val().key;              
            attachmentArray.push(key);
            });
           });
      $http({
                method: "POST",
                url: '/delete_task',
                data: {team:$scope.team,attachmentArray:attachmentArray,lastSegment:lastSegment},
                headers: {'Content-Type': 'application/json'},
           }).success(function(data){
              console.log(data);
           });          
    } 
}

Laravel 控制器

public function delete_task() {
    $s3 = AWS::get('s3');
    $task = Input::all();
    $bucket ='teamite/team'.$task['team'];

    //make the array for Objects on this side
    foreach ($task['attachmentArray'] as $value) {
        $array[] = array('Key' => $value);
      }
     // return $task['attachmentArray'][0];

      $result = $s3->deleteObjects(array(
          'Bucket' => 'teamite/team1',
          'Objects' => $array
      ));

      return $result;
}

我在亚马逊的控制台中记录了这个响应:

=====================
Debug output of model
=====================

Model data
-----------

This data can be retrieved from the model object using the get() method of the model   (e.g. $model->get($key)) or accessing the model like an associative array (e.g. $model['key']).

[Deleted] => Array
    (
        [0] => Array
            (
                [Key] => 4700pzgds4i_ad.jpg
            )

        [1] => Array
            (
                [Key] => xxvu29ms4i_ad.jpg
            )

    )

[RequestId] => 477F0DA04101D82E

所以它现在似乎工作正常.. 但是对象没有被删除? 我还有什么做错的?为这个疯狂!

【问题讨论】:

  • 没有足够的信息让我帮忙,但我建议您查看服务器上的文件所有权权限。
  • 我还能为您提供哪些信息?这是一个公共桶。我从这个存储桶中删除单个对象没有问题。
  • $json['attachmentArray'] 的值是多少?
  • 另外,您正在返回“成功删除文件”。无论如何
  • 当 i return $json['attachmentArray']; 在 s3 if 语句之前,我的控制台看起来像这样:i.imgur.com/ojTNZqs.png

标签: javascript php amazon-s3 laravel amazon


【解决方案1】:

实际上,您似乎没有正确引用文件(S3 对象)。请求的格式没问题,但桶名和键可能有误。

看着:

$bucket = 'teamite/team'.$task['team'];

您的存储桶是叫“teamite/team1”还是只是“teamite”?请记住,S3 具有扁平结构。没有“子桶”。如果您有嵌套文件结构中的内容,则需要将路径或伪文件夹作为键的一部分包含在内。

例如,在这个虚构的 S3 中对象的 URL 中:http://s3.amazonaws.com/all-of-my-things/photos/2013/12/photo0005.jpg

bucket为all-of-my-things,key为photos/2013/12/photo0005.jpg

由于 S3 操作的幂等性,您正在进行的 deleteObjects() 调用正在成功返回。如果多次删除一个对象,每次都会成功返回。您在这里看到的是您正在使用错误的键删除对象。这些键不存在,因此已被删除。

希望这会有所帮助。当您直接使用 SDK 对象时,不要害怕联系 module's issue tracker 或直接联系 SDK's issue tracker 以解决此类问题。

【讨论】:

  • 存储桶名称为teamite,文件位于team1文件夹中。您确定文件夹需要包含在文件名中吗?我一定会检查一下.. 但有点困惑,因为单个 deleteObject 文件使用文件夹名称作为存储桶的一部分,而不是文件名。很快就会回来报告。
  • 你这个男人。我在密钥中包含了文件夹名称,它起作用了。谢谢。
【解决方案2】:

要删除 s3 文件,请使用它

它对我有用 -

 $s3 = AWS::get('s3');
 $s3->deleteMatchingObjects('Your Bucket Name', 'File name to delete');

【讨论】:

    【解决方案3】:

    用于测试尝试:

    if(!$s3->deleteObjects(array(
                'Bucket'  => $bucket,
                'Objects' => $json['attachmentArray']
            ))) {
     return "error";
    } else {
     return "success";
    }
    

    catch 只会在异常发生时返回“There was an error”,而不是在 deleteObjects() 方法返回 false 时返回

    【讨论】:

    • 我已经用你的替换了我的原始代码。我犯了一个愚蠢的错误。我相信我必须错误地格式化我的$json['attachmentArray'];,因为我现在收到 500 服务器错误。我更新了我原来的问题,试图提供更多的背景信息。感谢凯文到目前为止的帮助!
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-05
    • 2015-04-09
    • 2011-12-29
    • 2017-07-06
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多