我在一次删除多个对象时遇到问题。
使用这个库-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']
根据文档显示格式正确(再次,我在放置,获取,删除等其他区域都没有问题)
有人可以指出我在搞砸吗?谢谢。
编辑:
尝试提供更多信息:
我正在从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
因此,它现在似乎可以正常工作。.但是,对象没有被删除吗?我还做错了什么?快疯了!
实际上看起来您没有正确引用文件(S3对象)。请求的格式很好,但是存储桶名称和键可能是错误的。
看着:
$bucket = 'teamite/team'.$task['team'];
您的存储桶是“ teamite / team1”还是“ teamite”?请记住,S3具有平面结构。没有“子桶”。如果您将内容布置在嵌套文件结构中,则需要将路径或伪文件夹包含在密钥中。
例如,在这个虚构的URL中,它指向S3中的一个对象: http://s3.amazonaws.com/all-of-my-things/photos/2013/12/photo0005.jpg
桶是all-of-my-things
,钥匙是photos/2013/12/photo0005.jpg
。
deleteObjects()
由于S3操作的幂等性质,您正在进行的呼叫已成功返回。如果多次删除对象,则每次都会成功返回。您在这里看到的是您正在使用错误的键删除对象。这些键不存在,因此已被删除。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句