所以我想提供大型文件,以便从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支持。
所以基本上没有完美的解决方案可以满足我的所有要求而不会妥协。如果有人有更好的想法,我愿意接受建议。