Java 从远程服务到S3存储桶的流文件

Java 从远程服务到S3存储桶的流文件,java,amazon-web-services,spring-boot,amazon-s3,aws-java-sdk,Java,Amazon Web Services,Spring Boot,Amazon S3,Aws Java Sdk,我有一个微服务,需要采取一个远程文件,并上传到S3桶。远程文件显示为下载链接,需要基本身份验证 使用最新的AWS 2.0 SDK,我正在尝试对文件进行流式处理,这样它就不必首先下载到服务器上。这些文件可以是90kb->100GB+之间的任意位置 使用Spring Boot 2.0,我找不到新的WebClient中是否有支持来处理此问题,因此我尝试将以下内容整合在一起: public Mono<String> upload(@PathVariable String projectId,

我有一个微服务,需要采取一个远程文件,并上传到S3桶。远程文件显示为下载链接,需要基本身份验证

使用最新的AWS 2.0 SDK,我正在尝试对文件进行流式处理,这样它就不必首先下载到服务器上。这些文件可以是90kb->100GB+之间的任意位置

使用Spring Boot 2.0,我找不到新的WebClient中是否有支持来处理此问题,因此我尝试将以下内容整合在一起:

public Mono<String> upload(@PathVariable String projectId, @RequestBody String downloadLink) {
    try {
        String authString = properties.getSilverstripe().getUsername() + ":" + properties.getSilverstripe().getToken();

        // Download link needs to be cleaned a little; 
        URL url = new URL(downloadLink.replaceAll("\"", ""));
        URLConnection urlConnection = url.openConnection();

        // Add basic authentication to the stream
        urlConnection.setRequestProperty("Authorization", "Basic " + new String(Base64.encodeBase64(authString.getBytes())));
        InputStream inputStream = urlConnection.getInputStream();

        // Attempt to create a input stream and upload to the bucket
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        Stream<String> stream = reader.lines();
        {
            stream.forEach(part -> {

                S3AsyncClient client = S3AsyncClient.create();
                client.putObject(
                        PutObjectRequest.builder()
                                .bucket(BUCKET)
                                .key(projectId + "/" + LocalDate.now() + ".sspak")
                                .build(),
                        AsyncRequestProvider.fromString(part)
                );

            });
        }

        return Mono.just(downloadLink);

    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}
公共Mono上载(@PathVariable String projectId、@RequestBody String downloadLink){
试一试{
字符串authString=properties.getSilverstripe().getUsername()+“:“+properties.getSilverstripe().getToken();
//下载链接需要清理一点;
URL=新URL(downloadLink.replaceAll(“\”,”);
URLConnection URLConnection=url.openConnection();
//向流添加基本身份验证
setRequestProperty(“授权”、“基本”+新字符串(Base64.encodeBase64(authString.getBytes()));
InputStream InputStream=urlConnection.getInputStream();
//尝试创建输入流并上载到bucket
BufferedReader reader=新的BufferedReader(新的InputStreamReader(inputStream));
Stream=reader.lines();
{
stream.forEach(部分->{
S3AsyncClient=S3AsyncClient.create();
client.putObject(
PutObjectRequest.builder()
.桶(桶)
.key(projectId+“/”+LocalDate.now()+“.sspak”)
.build(),
AsyncRequestProvider.fromString(部分)
);
});
}
返回Mono.just(下载链接);
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
我希望有一个相当标准的库/模式来做这件事,但我在网上找不到太多


任何帮助都可以理解。

不是答案,而是一个注释:如果你使用<代码> S3Cuthue/Cuth>API上传大文件到S3,你应该考虑添加<代码>内容长度< /代码>(和相关)头(s)。。这允许在上载时更好地缓冲文件,如果没有缓冲,应用程序将尝试在内存中缓冲整个文件,这可能不是所需的(但如果文件大小不大,则可能是正常的)。是否对此进行了更新?