2013-12-20 103 views
1

我有刪除一次對多個對象的問題..刪除多個對象的Amazon S3 PHP SDK

使用這個庫 - 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亞馬遜Docs- http://docs.aws.amazon.com/AmazonS3/latest/dev/DeletingMultipleObjectsUsingPHPSDK.html

我得到恢復"Success deleting files.";,但文件沒有被DELE特德。

我斗的名字是正確的,$json['attachmentArray']根據文檔是正確的格式(再次,我有喜歡放其他方面沒有任何問題,獲取,刪除)

誰能指出哪裏我嗯搞砸了? 謝謝。

編輯:

試圖讓更多的信息:從一個角度功能,Laravel端點

我張貼信息。

這裏是角功能(火力地堡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(從@Kevin佛羅里達更新的代碼我Laravel控制器:

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 

所以現在看來​​一切正常。但是這些對象並沒有被刪除? 我還做了什麼錯?在這個瘋狂!

+0

沒有足夠的信息對我的幫助,但我建議你看一下服務器上文件的所有權的權限。 –

+0

我可以爲您提供什麼更多信息?這是一個公共桶。我從這個存儲桶中刪除單個對象沒有問題。 –

+0

$ json ['attachmentArray']的值是什麼? –

回答

4

它實際上看起來,你是不是正確引用文件(S3對象)。請求的格式很好,但存儲桶名稱和密鑰可能是錯誤的。

綜觀:

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

被稱爲 「teamite/TEAM1」 或只是 「teamite」 你鬥?請記住,S3具有扁平結構。沒有「subbuckets」。如果你的東西是嵌套在文件結構中的,那麼路徑或僞文件夾需要被包含在關鍵字中。

例如,在此假想的URL的一個對象在S3:http://s3.amazonaws.com/all-of-my-things/photos/2013/12/photo0005.jpg

剷鬥是all-of-my-things,關鍵是photos/2013/12/photo0005.jpg

由於S3操作的冪等性,您正在調用的deleteObjects()調用正在成功返回。如果您多次刪除對象,則每次都會成功返回。你在這裏看到的是你使用錯誤的鍵刪除對象。這些鍵不存在,因此已被刪除。

希望這會有所幫助。當您直接使用SDK對象時,不要害怕在module's issue tracker上或直接在SDK's issue tracker上遇到類似問題。

+0

桶名稱是'teamite',文件位於'team1'文件夾中。你確定文件夾需要包含在文件名中嗎?我一定會檢查這一點..但有點困惑,因爲單個'deleteObject'文件使用文件夾名稱作爲桶的一部分,而不是文件名。很快會報告回來。 –

+0

你達人。我用鑰匙包括了文件夾名稱,它工作。謝謝。 –

1

出於測試的嘗試:

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

抓只會返回如果發生異常,「有錯誤」沒有如果deleteObjects()方法返回false

+0

我已經替換了我的原始代碼與你的。愚蠢的錯誤在我的角色。 我相信我必須格式化我的'$ json ['attachmentArray'];'不正確,因爲我現在得到500服務器錯誤。我更新了我的原始問題,試圖提供更多的上下文。感謝Kevin的幫助! –

2

要刪除S3文件中使用它

這對我的工作 -

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