将文件从远程服务流式传输到S3存储桶

时间:2018-01-28 22:40:55

标签: 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, @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;
}

我希望有一个非常标准的库/模式来做这个,但我找不到很多在线。

任何帮助都表示赞赏。

0 个答案:

没有答案