Ita*_*chi 9 amazon-s3 go aws-sdk
我有以下工作代码从Amazon s3中删除对象
params := &s3.DeleteObjectInput{
Bucket: aws.String("Bucketname"),
Key : aws.String("ObjectKey"),
}
s3Conn.DeleteObjects(params)
Run Code Online (Sandbox Code Playgroud)
但我想要做的是使用通配符**删除文件夹下的所有文件.我知道亚马逊s3不会将"x/y/file.jpg"视为x中的文件夹y,但我想要实现的是通过提及"x/y*"删除具有相同前缀的所有后续对象.尝试亚马逊多对象删除
params := &s3.DeleteObjectsInput{
Bucket: aws.String("BucketName"),
Delete: &s3.Delete{
Objects: []*s3.ObjectIdentifier {
{
Key : aws.String("x/y/.*"),
},
},
},
}
result , err := s3Conn.DeleteObjects(params)
Run Code Online (Sandbox Code Playgroud)
我知道在php中它可以通过s3-> delete_all_objects按照这个答案轻松完成.在GOlang中可以采取相同的行动.
不幸的是,goamz 包没有类似于 PHP 库的delete_all_objects.
但是,PHP 的源代码delete_all_objects可在此处获取(切换源视图):http://docs.aws.amazon.com/AWSSDKforPHP/latest/#m=AmazonS3/delete_all_objects
以下是重要的代码行:
public function delete_all_objects($bucket, $pcre = self::PCRE_ALL)
{
// Collect all matches
$list = $this->get_object_list($bucket, array('pcre' => $pcre));
// As long as we have at least one match...
if (count($list) > 0)
{
$objects = array();
foreach ($list as $object)
{
$objects[] = array('key' => $object);
}
$batch = new CFBatchRequest();
$batch->use_credentials($this->credentials);
foreach (array_chunk($objects, 1000) as $object_set)
{
$this->batch($batch)->delete_objects($bucket, array(
'objects' => $object_set
));
}
$responses = $this->batch($batch)->send();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,PHP 代码实际上会在存储桶上发出 HTTP 请求,以首先获取所有匹配的文件,该文件在其他地方PCRE_ALL定义为。const PCRE_ALL = '/.*/i';
一次只能删除1000个文件,所以delete_all_objects创建了一个批量功能,一次删除1000个文件。
您必须在 go 程序中创建相同的功能,因为 goamz 包尚不支持此功能。幸运的是,它应该只有几行代码,并且您有来自 PHP 库的指南。
完成后,可能值得提交 goamz 包的拉取请求!
| 归档时间: |
|
| 查看次数: |
4490 次 |
| 最近记录: |