Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在完成文件内容之前启动文件下载_Javascript_Http - Fatal编程技术网

Javascript 在完成文件内容之前启动文件下载

Javascript 在完成文件内容之前启动文件下载,javascript,http,Javascript,Http,在我的webapp中,用户可以选择下载包含一些数据的文件,他们可以通过单击按钮来下载。对于少量数据,文件会立即开始下载,并显示在浏览器的下载区域。这很好 对于大量数据,服务器可能需要花费大量时间来计算数据,甚至在我们开始下载之前。这不好。我想表明计算正在进行中。但是,我不想在我的UI上放置一个“忙”指示器,因为该操作不会阻止UI—用户应该能够在准备文件时执行其他操作 在我看来,一个好的解决方案是在我完成计算之前开始下载过程。我们总是知道(或者可以快速计算)文件的前几百个字节。是否有一种机制可以让

在我的webapp中,用户可以选择下载包含一些数据的文件,他们可以通过单击按钮来下载。对于少量数据,文件会立即开始下载,并显示在浏览器的下载区域。这很好

对于大量数据,服务器可能需要花费大量时间来计算数据,甚至在我们开始下载之前。这不好。我想表明计算正在进行中。但是,我不想在我的UI上放置一个“忙”指示器,因为该操作不会阻止UI—用户应该能够在准备文件时执行其他操作

在我看来,一个好的解决方案是在我完成计算之前开始下载过程。我们总是知道(或者可以快速计算)文件的前几百个字节。是否有一种机制可以让服务器用这几个字节响应下载请求,从而开始下载并使文件显示在下载区域,并在我完成计算后提供文件的其余部分?我知道下载看起来会暂停,这不是问题


我可以很快对文件大小做出很好的估计。我宁愿不使用第三方软件包来实现这一点,除非它非常简单。我们正在使用Angular,但如果需要,我们很乐意为原始JS编码。

您要求提供一个通用解决方案

1)首先,在HTML/JS中,您可以通过将下载
target
设置为任何其他网页来防止UI被阻止,实现这一点的首选方法是将目标设置为
IFRAME

<!-- your link must target the iframe "downloader-iframe" -->
<a src="../your-file-generator-api/some-args?a=more-args" target="downloader-iframe">Download</a>
<!-- you don't need the file to be shown -->
<iframe id="downloader-iframe" style="display: none"></iframe>

和(可选)标题,请小心使用“长度”标题,如果您未计算
文件大小,则不会下载该标题。如果不使用
内容长度
,则不会看到“下载进度”

3)第三,在您的后端,您必须确保在响应时直接写入字节!这样,您的浏览器和Web服务器就会知道下载正在进行中

  • Java示例:
  • C#的示例:
如何构建这3个步骤将取决于您,您正在使用的框架和库,例如Dojo和JQuery有很棒的
IFRAME
操作实用程序,所有这些都认为您可以自己编写代码,这是一个JQuery示例:

也: 添加一个“忙碌”的动画是可以的!您只需确保它不会阻塞您的UI,如下所示:
要指示链接指向客户端上的下载,最简单的方法是链接上的属性。属性的存在告诉浏览器不要卸载当前选项卡或创建新选项卡;该属性的值是建议的文件名


对于后端部分,在设置了正确的响应头之后,只需将数据写入可用的输出流。

请提供有关服务器端代码、java、tomcat的更多详细信息?另外,请包括一些关于如何为您下载工程的细节。。。您的文件是否存储在数据库中?我们的服务器是C#,但我正在寻找一个通用解决方案。该文件未存储在数据库中。我们需要基于API参数创建它。实际上,最佳实践(如果您正在生成大量数据)是将数据通过管道传输到输出流,同时将背压传播到生成该数据的进程,以避免生成的数据比客户端下载的速度快得多,这将迫使服务器将多余的内存保留在内存中,直到可以接收为止。