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

时间:2018-10-03 09:50:53

标签: spring spring-boot spring-integration spring-integration-sftp spring-integration-aws

有一个Spring Boot应用程序,我打算在其中将文件放置在S3目标存储桶的文件夹中。 target-bucket / targetsystem-folder / file.csv

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

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

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

已经阅读了一些文档,例如将文件放在文件夹下,必须给出诸如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>

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

2 个答案:

答案 0 :(得分:3)

您的问题arma::lu中的SpEL错误。只需尝试从常规Java代码开始,然后想象一下您如何构建这样的值。然后,您将发现表达式中缺少串联操作:

key-expression

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

答案 1 :(得分: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(然后将文件放入其中),否则,将文件放入其中。


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

  

S3中没有“子目录”。有水桶,有   存储桶中的键。

     

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

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