0

以下是用于发送文件的HttpServletResponse头和内容类型。高达32MB的数据传递给客户端,但我的整个数据大小为100MB。如何通过Http Servlet响应发送大文件

response.setContentType("application/octet-stream"); 
response.setHeader("Transfer-Encoding", "chunked"); 
response.setHeader("Content-Disposition", "attachment; filename="filename.bin"); 

我不能将这些数据存储到云存储中,因为这是为每个用户创建的。

这是否可以通过HttpServletResponse实现?或者我需要移动到其他方法,例如套接字等。

请推荐一种适用于多客户端环境的方法。

+0

嗨@Brainislav我正在使用谷歌应用程序引擎来实现这一点。需要GAE标签才能看到。 – SetV

+0

这是否(32MB的问题)发生在任何浏览器,或只是与特定的一个。设置“Content-Length”标题可能很有用。另请参阅http://stackoverflow.com/questions/685271/using-servletoutputstream-to-write-very-large-files-in-a-java-servlet-without-me –

+0

您应该通过API设置分块传输模式,不是这样。除非通过API告诉它,否则它实际上不会进行任何分块。 – EJP

回答

1

App引擎拥有配额,旨在保护每个人免受失控应用程序的侵害。您的应用程序在单个入站HTTP请求中可以接收的最大数据量为32MB。

如果你想上传大文件,那么你应该看看Blobstore API

查看quota documentation了解更多详情。

+0

嗨@jarmod,我明白了你的观点。我想下载生成的数据,是否有类似Blobstore/Cloud Storage的工作?如果你有想法,请分享。 – SetV

+0

如果您想上传或下载大文件,那么我认为您应该使用GCS,并且您的客户端应该直接与GCS服务进行交互以进行上传/下载。在下载的情况下,您的应用服务器可以创建一个有时间限制的签名URL,将其提供给客户端,然后客户端可以从GCS直接安全地下载文件。您应该避免让您的应用服务器充当代理服务器,以便上传到GCS和从GCS下载。 – jarmod

1

您无法绕过32mb的请求限制。您最好的选择是将数据推送到GCS,并生成一个signed URL

根据您需要做什么来生成100MB文件,您可能需要使用任务队列卸载整个进程以防止请求超时。