如何将POST请求的流响应下载到文件中?

时间:2018-02-05 15:14:16

标签: javascript html ajax download stream

所以我想提供大型文件,以便从Java EE(JAX-RS)应用服务器下载到基于浏览器的Javascript客户端。内容不适合服务器或客户端的内存,因此只有流或块是合适的。内容取决于POST参数和HTTP标头,包括用于解密的用户名和密码,因此不希望进行简单的基于GET的下载。内容必须可以作为文件下载。只支持Firefox和Chrome。

在服务器端,解决方案非常简单,JAX-RS专门针对流式响应提供StreamingOutput。然而,在客户端,我没有看到明显的解决方案。 Javascript + HTML + HTTP显然不支持我的要求。我调查过的一些可能的解决方案:

  • 忘记POST参数和HTTP标头,发送GET请求的URL中的所有内容。这是不可取的,因为用户名和密码也会在地址中发送。

  • 将参数放入带有隐藏输入的HTML表单中,然后提交到_blank目标。这使事情变得复杂,因为我们必须使用application / x-www-form-urlencoded(或multipart / form-data)而不是application / json作为POST参数。

  • HTTP字节范围标头。据我所知,它们只能用于GET请求,而不能用于POST。

  • 使用AJAX下载内容,使用数据URI创建新的HTML5链接,然后单击它。例子是。这种方法不能扩展,在几百兆字节后耗尽内存。

  • 在服务器端缓存结果,并使用GET提供下载的唯一ID。不幸的是,目前我们没有任何空间或内存来缓存结果。

  • 自定义XMLHttpRequest.responseType。不幸的是,moz-chunked-arraybuffer和ms-stream是浏览器特定的非标准功能。此外,还必须解决下载问题。

  • 我瞥了一眼https://github.com/jimmywarting/StreamSaver.js,但似乎非常矫枉过正,并且不支持Firefox。

  • Streams API,Fetch API。 Firefox中没有ReadableStream支持。

所以基本上没有完美的解决方案可以满足我的所有要求而不会妥协。如果有人有更好的想法,我愿意接受建议。

0 个答案:

没有答案