【问题标题】:How to send a large file over Http Servlet response如何通过 Http Servlet 响应发送大文件
【发布时间】:2016-08-01 14:42:13
【问题描述】:

以下是用于发送文件的 HttpServletResponse 标头和内容类型。最多 32MB 的数据被传递给客户端,但我的整个数据大小为 100MB。

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

我无法将此数据存储到云存储中,因为这将由每个用户创建。

这可以通过HttpServletResponse来实现吗?或者我需要使用其他方法,比如套接字等。

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

【问题讨论】:

  • 嗨@Brainislav 我正在使用谷歌应用引擎来实现这一点。需要 GAE 标签才能获得可见性。
  • 这种情况(32MB 问题)是否发生在任何浏览器上,或者仅发生在特定浏览器上。设置Content-Length 标头可能很有用。另见stackoverflow.com/questions/685271/…
  • 您应该通过API设置分块传输模式,而不是这样。除非您通过 API 告诉它,否则它实际上不会进行任何分块。
  • @EJP 怎么做?请分享参考。
  • Err,哎呀,HttpServletResponse 中没有相应的 API,但这也是不设置标头的更多原因。除非 servlet 容器这样做,否则不会有任何分块编码,在这种情况下,它将插入自己的分块和自己的标头。在 Tomcat 中,这是通过设置 Connector property 来完成的。

标签: google-app-engine servlets google-cloud-storage google-cloud-endpoints google-cloud-platform


【解决方案1】:

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

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

有关详细信息,请参阅quota documentation

【讨论】:

  • 嗨@jarmod,我明白了。我想下载生成的数据,类似的 Blobstore/Cloud Storage 可以吗?如果您有想法,请分享。
  • 如果您想上传或下载大文件,那么我认为您应该使用 GCS,并且您的客户端应该直接与 GCS 服务交互以进行上传/下载。在下载的情况下,您的应用服务器可以创建一个有时间限制的签名 URL,将其提供给客户端,然后客户端可以直接从 GCS 安全地下载文件。您应该避免让您的应用服务器充当代理服务器,以便上传到 GCS 和从 GCS 下载。
【解决方案2】:

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

根据生成 100mb 文件所需执行的操作,您可能需要使用任务队列卸载整个过程以防止请求超时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多