当前位置: 首页 > 知识库问答 >
问题:

在Spring boot中下载AWS S3文件作为流

空慈
2023-03-14

我想公开一个API来将S3 bucket文件内容作为流下载给它的使用者。API URL类似于/downloadfile/**,即GET request。

  1. 现在返回类型应该是什么?我尝试使用accept header=application/octet-stream,但不起作用。
  2. 我不想把文件的内容写到任何文件中并发送它。它应该作为流返回。

这里是控制器伪代码,我写到现在,它给我406错误所有的时间。

 @GetMapping(value = "/downloadfile/**", produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE })
    public ResponseEntity<Object> downloadFile(HttpServletRequest request) {
       //reads the content from S3 bucket and returns a S3ObjectInputStream
       S3ObjectInputStream object = null;
       object = publishAmazonS3.getObject("12345bucket", "/logs/file1.log").getObjectContent();
       return object
    }

这里对这样做的方式和我做错了什么有什么建议吗?

共有1个答案

常培
2023-03-14

通过使用Spring中的StreamingResponseBody类,我可以将该文件作为流下载。

下面是我使用的代码:

    @GetMapping(value = "/downloadfile/**", produces = { MediaType.APPLICATION_OCTET_STREAM_VALUE })
    public ResponseEntity<S3ObjectInputStream> downloadFile(HttpServletRequest request) {
       //reads the content from S3 bucket and returns a S3ObjectInputStream
       S3Object object = publishAmazonS3.getObject("12345bucket", "/logs/file1.log");
       S3ObjectInputStream finalObject = object.getObjectContent();

        final StreamingResponseBody body = outputStream -> {
            int numberOfBytesToWrite = 0;
            byte[] data = new byte[1024];
            while ((numberOfBytesToWrite = finalObject.read(data, 0, data.length)) != -1) {
                System.out.println("Writing some bytes..");
                outputStream.write(data, 0, numberOfBytesToWrite);
            }
            finalObject.close();
        };
        return new ResponseEntity<>(body, HttpStatus.OK);
    }

测试流是否正确的方法是下载一个400MB左右的文件。通过传入vm选项将Xmx减少到256MB。现在,比较使用StreamingResponseBody和不使用StreamingResponseBody的下载功能,当使用传统的OutputStreams编写内容时,您将获得OutofMemoryError

 类似资料:
  • 我正在使用AngularJS和Spring编写应用程序。我想向服务器发送请求,并下载控制器返回的响应作为文件。在控制器中,我有csv文件的内容(作为字符串),即<代码>1;2.3.4(1行4列)。将此响应下载为文件的最简单方法是什么? 下面,我发布了我的简化代码。Spring控制器: 在javascript中(AngularJS) 我还试图写入响应流(如下所示),设置标题,但在客户端,我总是以字符

  • 我想问一下,如何在SpringBoot中将文件夹作为资源或文件加载。假设我有src/main/resources/testfolder,我想做如下事情: ^但这将失败,因为ResourceUtils只能加载实际文件(.txt、.csv等),不是文件夹。。提前非常感谢。。 编辑: 原因是我需要得到文件夹的绝对路径... folderpath应该是“/workspace/intellij/Projec

  • 问题内容: 似乎只能通过以下方式通过FTP上传文件: https://wiki.jenkins- ci.org/display/JENKINS/Publish+Over+FTP+Plugin 但是我需要通过FTP下载文件,为此我可以编写一个groovy插件,但是似乎没有这个插件 问题答案: 可能是因为在构建过程中使用单线下载文件很简单: 卷毛工具几乎可用于所有操作系统。 如果您只需要通过FTP下载

  • 问题内容: 如何使用php将多个文件下载为zip文件? 问题答案: 您可以使用该类创建一个ZIP文件并将其流式传输到客户端。就像是: 并流式传输: 第二行强制浏览器向用户显示一个下载框,并提示名称filename.zip。第三行是可选的,但某些(主要是较旧的)浏览器在某些情况下会出现问题,而未指定内容大小。

  • 我有一个Django视图(下载-附件),它返回一个Django.http.response.HttpResponse对象。

  • 我有一个API可以返回excel文档作为响应。请求将是一个简单的JSON。 我搜索了谷歌,找到了一些代码库下载文件,我已经在我的应用程序中使用了它,但我得到了一些错误,无法找到它的解决方案。下面是我的代码库。 NameService.ts HTTPService.ts 使用上面的代码库,我得到了以下两个错误,文件没有下载。 null