3

有一个弹簧启动应用程序,我想在其中将文件放在 S3 目标存储桶的文件夹中。目标桶/目标系统文件夹/file.csv

对于将从 yml 配置文件中检索的每个文件,目标系统文件夹名称将有所不同。

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

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

已经阅读了一些文件,比如将文件放在文件夹下,必须给出 key-expression,如 targetsystem-folder/file.csv 和 bucket = target-bucket。但这行不通。想使用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>

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

4

2 回答 2

3

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

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

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

于 2018-10-03T12:47:33.223 回答
0

在我之前工作的项目中,我只是使用了提供的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在存储桶内创建(然后将文件放入其中),如果它不存在,则将文件放入其中。


您可以将此答案作为参考,以进一步解释该主题。

S3 中没有“子目录”。有桶,桶内有键。

您可以使用前缀搜索来模拟传统目录。例如,您可以将以下密钥存储在存储桶中:

foo/bar1
foo/bar2
foo/bar3
blah/baz1
blah/baz2
于 2018-10-03T10:04:53.993 回答