强制浏览器下载大文件

时间:2016-04-26 00:27:46

标签: javascript http browser

我使用带有body的POST请求在服务器端动态创建指定文件,并将其作为响应流式传输到客户端。客户端的问题是文件被下载到响应对象(我认为是浏览器的高速缓存,作为临时文件),而不是PC的硬盘。

如何直接为浏览器传递字节流以处理和指向/ Downloads文件夹或用户设置下载的位置?

文件大小非常大,小工具的硬盘驱动器上没有足够的空间来创建它并为GET请求提供链接。所以我需要动态创建它并作为POST响应流式传输到客户端。

现在我已经在Angular中编写了我的代码,但语言并不重要。我想了解浏览器如何处理这种情况 当我执行HTTP请求时,我敢打赌浏览器会在它传递给套接字之前对其执行某些操作。并且我确定浏览器在将其传递给执行请求的代码片段之前也会对收到的请求执行某些操作。

我的意思是你只能通过设置响应标题让浏览器将文件下载到/ Downloads?如果数据包被盗,那么等待的HTTP请求会发生什么?#34;通过浏览器?或者当响应头到达响应对象时,您能以某种方式通知浏览器响应的主体是我们希望下载到/ Downloads的文件字节流吗?

我也可以修改我的服务器代码。

编辑更详细的解释:
我的服务器正在向客户端发送5GB文件。我不想直接在浏览器的临时内存中接收该文件,而是将文件直接保存在硬盘上 但是,浏览器自然会阻止直接访问用户计算机,因此我无法在那里编写它。那么如何传递字节流以供浏览器处理并保存到文件中呢?

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了这个问题。因此,如果您从javascript代码向服务器发送文件请求,浏览器将直接将收到的响应传递给您的响应对象,但如果没有外部(浏览器支持的)工具,则无法将其存储在硬盘驱动器上。 / p>

我的意思是,如果你从脚本中执行任何类型的$ http.post()或.get(),响应将被传递给$ http.post()。然后(function(response){。 ..})直接并且仅在收到整个响应后才传递。这意味着如果你期望一个大小为5GB的文件,它将因为太大而无法在响应对象中被接收而失败。

相反,您需要做的是以另一种方式触发下载。我在代码中所做的是我构建了一个隐藏的

<form method="POST" action="/set.uri.here/" id="download">...</form>

当用户单击按钮下载文件时,我运行一个函数来构建表单的主体,然后提交它。看起来像

var form = document.getElementById("download"); // magic here... create the body for the form and so on form.submit();

这样您就可以通过浏览器传递请求,然后浏览器也会处理响应。这是您自己或浏览器执行请求之间的关键区别。如果您自己提出请求,那么浏览器将不会下载该对象,但您将自己收到该对象。

如果您希望浏览器下载该对象,那么,让浏览器也对该对象进行请求!