我在一次删除多个对象时遇到问题..
使用这个库- 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/