我目前正在使用Amazon S3,并且正在编写一个使用修改日期的程序。我正在寻找一种方法来编辑修改后的日期。
我可以遍历所有文件并按原样保存它们,但这听起来像是一个糟糕的解决方案。
在 PHP 中有这个函数touch()。
有没有人知道解决方案,或者有同样的问题?
回应@Daniel Golden 对@tkotisis 回答的评论。看起来至少 AWS CLI 工具不允许您将项目复制到自身。但是,您可以通过更新元数据来“强制”复制。
$ aws s3 cp --metadata '{"touched":"now"}' s3://path/to/object s3://path/to/object
这将重新创建对象(下载到调用者并重新上传)替换其内容、所有者和元数据。这也将触发任何附加的 Lambda 事件。
您可以通过复制对象请求来实现相同的目的,将 CopySource 指定为与目标键相同。
本质上,这将使用相应的源和目标存储桶/密钥向 S3发出PUT Object - COPY请求。
这是将空(或 o 字节)文件上传到 S3 的另一个原因。我验证了这个工作您还可以使用 S3 API 上传没有正文的文件,如下所示:
aws s3api put-object --bucket "myBucketName" --key "dir-1/my_null_file"
通常你会指定一个--body
blob,但它的选项只会按预期添加键。查看更多关于S3 API put-object
测试的 AWS CLI 版本是:aws-cli/2.0.4 Python/3.7.5 Windows/10 botocore/2.0.0dev8
以下是我在 PHP 中的做法(即使在过时的 5.4 中也可以使用,不得不退回):
// Init an S3Client
$awsConfig = $app->config('aws');
$aws = Aws::factory($awsConfig);
$s3Bucket = $app->config('S3_Bucket');
$s3Client = $aws->get('s3');
// Set null/empty file.
$result = $s3Client->putObject([
'Bucket' => $s3Bucket,
'Key' => "dir-1/my_null_file",
'Body' => '',
'ServerSideEncryption' => 'AES256',
]);
我发现自己在测试时经常执行复制技巧,以至于我在 .bashrc 中添加了一个方便的功能:
s3-touch() {
aws s3 cp \
--metadata 'touched=touched' \
--recursive --exclude="*" \
--include="$2" \
"${@:3}" \
"$1" "$1"
}
示例用法:
# will do a dryrun on a copy operation
s3-touch s3://bucket/prefix/ "20200311*" --dryrun
# the real thing, creating events for all objects
# in s3://bucket/prefix/ that start with 20200311
s3-touch s3://bucket/prefix/ "20200311*"
我这样做主要是为了我想要触发的 S3 事件。
在@g-io 回答简化了我的一天之后,这是另一个版本,可以轻松触摸单个文件
s3-touch-single() {
aws s3 cp \
--metadata 'touched=touched' \
"${@:3}" \
"$1" "$1"
}
例如,循环我们需要接触的文件数组:
paths=("mydir/image.png" "mydir2/image2.png")
for i in "${paths[@]}"; do s3-touch-single "s3://my-bucket/$i"; done
查看https://github.com/emdgroup/awscli-s3touch
它是添加touch
命令的 AWS CLI 插件。
用法:
aws s3 touch my-bucket --prefix myfolder/
它通过读取附加到存储桶的事件并在客户端模拟它们来工作。