在 Spring Boot 中流式传输/下载文件而不保存在内存中

我的应用程序使用 Google Cloud Storage 存储大文件并使用 Spring Boot 作为后端。

我刚刚完成了负责下载的控制器的实现,按照我认为可能是正确的,但是我从浏览器得到的行为不是我所期望的。

步骤

如果我尝试下载文件,将发生以下情况:

  1. 使用 ReadChannel 从谷歌云存储中读取文件(“blob”)

  2. 通道写入 ByteArrayOutputStream;

  3. 通道使用缓冲区写入

  4. ByteArrayOutputStream 在 InputStreamResource 中转换

  5. 然后在 ResponseEntity 中传递 inputStream 资源

意外的行为

如果用户去下载的控制器,并要求一个特定的文件,该文件首先完全加载到服务器上,然后提供给客户端。同时,客户端看到服务器“没有响应”(因为服务器正在加载文件),这不好。当文件完全加载到服务器上时,会很快出现在“已下载”中。

我想要的是避免“无响应”部分,并将文件流式传输到客户端,就像您尝试下载大文件时通常发生的那样,您会在 Chrome 中看到文件周围的“下载”轮.

任何帮助理解以下代码有什么问题将不胜感激!


慕妹3146593
浏览 531回答 1
1回答

红颜莎娜

根据您的问题,您的存储桶中的对象是私有的,您希望为有限的一群人授予对它们的访问权限。如果是这样 - 签名 URL 就是您所需要的。您可以为存储桶中的特定对象生成签名 URL,并将您的用户重定向到生成的 URL - 因此他将自己下载文件。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java