javascript - 删除多个对象 Amazon s3 PHP SDK

标签 javascript php amazon-s3 laravel amazon

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

使用这个库- 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";
    }

删除对象 Amazon Docs- http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingPHPSDK.html

返回“删除文件成功。”;,但文件没有被删除。

我的存储桶名称是正确的,并且 $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 Controller (使用来自@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:

Angular 函数

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

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

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

最佳答案

实际上,您似乎没有正确引用文件(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() 调用成功返回。如果多次删除一个对象,每次都会成功返回。您在这里看到的是您正在使用错误的键删除对象。这些键不存在,因此已被删除。

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

关于javascript - 删除多个对象 Amazon s3 PHP SDK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20704921/

相关文章:

php - 3rd 方网站身份验证库(如 openid)

javascript - 如何在网格的行编辑器移动时获取事件

javascript - 如何在oracle Apex中使用excel作为数据库?

javascript - MathJax 中的 HTML 实体(<、> 和 &)支持

php - 收件箱、发件箱删除错误 - 请帮助我

hadoop - 使用distp和s3a方案将文件从HDFS复制到Amazon S3

javascript - Jade - 显示对象属性 - 未定义

php - 检查单个 mysql 表行并仅对它们应用一个函数

来自 Amazon S3 MP4/MOV URL 的 iOS 缩略图

amazon-web-services - AWS SDK for Java 版本 2 的 S3Exception - 我们计算的请求签名与您提供的签名不匹配