将文件放入 S3 存储桶的文件夹中

Placing file inside folder of S3 bucket

有一个 spring 启动应用程序,我想在其中放置一个文件到 S3 目标存储桶的文件夹中。 target-bucket/targetsystem-folder/file.csv

每个将从 yml 配置文件中检索的文件的目标系统文件夹名称都不同。

如果文件夹不退出,则必须通过代码创建目标系统文件夹,文件应放在文件夹下

据我所知,S3 bucket中没有文件夹的概念,都是作为对象存储的。

读过一些文档喜欢将文件放在文件夹下,必须给出像 targetsystem-folder/file.csv 和 bucket = target-bucket 这样的 key-expression。 但它不起作用 out.Would 喜欢使用 spring-integration-aws 而不直接使用 aws-sdk 来实现此目的

    <int-aws:s3-outbound-channel-adapter id="filesS3Mover"
        channel="filesS3MoverChannel"
        transfer-manager="transferManager"
        bucket="${aws.s3.target.bucket}"
        key-expression="headers.targetsystem-folder/headers.file_name"
        command="UPLOAD">
</int-aws:s3-outbound-channel-adapter>

任何人都可以指导这个问题

之前在做的项目中,我只是使用了java提供的aws sdk。然后在我的实现中,我做了这样的事情

private void uploadFileTos3bucket(String fileName, File file) {
    s3client.putObject(new PutObjectRequest("target-bucket", "/targetsystem-folder/"+fileName, file)
            .withCannedAcl(CannedAccessControlList.PublicRead));
}

我没有再创建配置。它会自动在存储桶中创建 /targetsystem-folder(然后将文件放入其中),如果不存在,则将文件放入其中。


您可以参考this answer,进一步解释该主题。

There are no "sub-directories" in S3. There are buckets and there are keys within buckets.

You can emulate traditional directories by using prefix searches. For example, you can store the following keys in a bucket:

foo/bar1
foo/bar2
foo/bar3
blah/baz1
blah/baz2

你的问题是key-expression中的SpEL是错误的。只需尝试从常规 Java 代码开始,想象一下您希望如何构建这样一个值。然后你会发现你的表达式中缺少连接操作:

 key-expression="headers.targetsystem-folder + '/' + headers.file_name"

另外,请日后提供更多有关错误的信息。在大多数情况下,堆栈跟踪非常有用。