33

我目前正在使用Amazon S3,并且正在编写一个使用修改日期的程序。我正在寻找一种方法来编辑修改后的日期。

我可以遍历所有文件并按原样保存它们,但这听起来像是一个糟糕的解决方案。

在 PHP 中有这个函数touch()

有没有人知道解决方案,或者有同样的问题?

4

6 回答 6

37

回应@Daniel Golden 对@tkotisis 回答的评论。看起来至少 AWS CLI 工具不允许您将项目复制到自身。但是,您可以通过更新元数据来“强制”复制。

$ aws s3 cp --metadata '{"touched":"now"}' s3://path/to/object s3://path/to/object

这将重新创建对象(下载到调用者并重新上传)替换其内容、所有者和元数据。这也将触发任何附加的 Lambda 事件。

于 2016-05-27T06:02:37.063 回答
18

您可以通过复制对象请求来实现相同的目的,将 CopySource 指定为与​​目标键相同。

本质上,这将使用相应的源和目标存储桶/密钥向 S3发出PUT Object - COPY请求。

于 2012-11-19T16:26:46.473 回答
6

这是将空(或 o 字节)文件上传到 S3 的另一个原因。我验证了这个工作您还可以使用 S3 API 上传没有正文的文件,如下所示:

aws s3api put-object --bucket "myBucketName" --key "dir-1/my_null_file"

通常你会指定一个--bodyblob,但它的选项只会按预期添加键。查看更多关于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',
]);
于 2020-08-06T23:47:47.047 回答
4

我发现自己在测试时经常执行复制技巧,以至于我在 .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 事件。

于 2020-03-11T13:47:06.280 回答
1

在@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
于 2020-06-29T09:47:01.137 回答
0

查看https://github.com/emdgroup/awscli-s3touch

它是添加touch命令的 AWS CLI 插件。

用法:

aws s3 touch my-bucket --prefix myfolder/

它通过读取附加到存储桶的事件并在客户端模拟它们来工作。

于 2018-05-17T16:39:33.640 回答