2016-04-26 75 views
1

我正在使用POST請求與身體動態地在服務器端創建一個指定的文件,並將其作爲響應流式傳輸到客戶端。客戶端的問題在於該文件正在被下載到響應對象(瀏覽器的緩存內存,我想,作爲臨時文件)而不是PC的硬盤驅動器。強制瀏覽器下載一個大文件

如何直接傳遞字節流以供瀏覽器處理並直接進入/ Downloads文件夾或用戶設置下載的任何位置?

文件大小非常大,小工具硬盤上沒有足夠的空間來創建它併爲GET請求提供鏈接。所以我需要立即創建它並以POST響應的形式傳輸到客戶端。

現在我已經用Angular編寫了我的代碼,但語言並不重要。我想了解瀏覽器如何處理這種情況。
當我執行HTTP請求時,我敢打賭,瀏覽器在傳遞給套接字之前會做一些事情。我確信瀏覽器在接收到的請求之前也會執行某些操作,然後將它傳遞給執行請求的代碼片段。

我的意思是你只能通過設置響應標題使瀏覽器下載文件到/ Downloads?如果數據包被瀏覽器「盜取」,那麼等待HTTP請求會發生什麼?或者,當響應頭到達響應對象時,您能否以某種方式通知瀏覽器響應的主體是我們希望下載到/ Downloads的文件字節流?

而且我也有可能修改我的服務器代碼。

編輯更詳細的解釋:
我的服務器正在發送5GB文件到客戶端。而不是隻在瀏覽器的臨時存儲器中接收該文件,我想直接將文件保存在硬盤上。
但自然瀏覽器阻止直接訪問用戶計算機,所以我不能在那裏寫它。那麼如何傳遞瀏覽器的字節流來處理並保存到文件中呢?

+0

你不能。下載位置由客戶決定。 「此PC /下載」通常是Windows上的默認設置,但客戶可以決定其他內容。 – PHPglue

+0

試圖將文件下載到用戶文件系統的特定文件夾的目的是什麼? – guest271314

+0

問題是一般在PC上下載文件,而不是將其下載到特定路徑。目前我只能將文件下載到瀏覽器緩存中,並且不會將其下載到PC的硬盤上。我希望這個澄清一點。 – user3622167

回答

0

好的,我已經解決了這個問題。因此,如果您自己從JavaScript代碼發送文件請求到服務器,瀏覽器會直接將收到的響應傳遞給響應對象,但如果沒有外部(瀏覽器支持)工具,則無法將其存儲在硬盤上。

我的意思是,如果您從腳本中執行任何類型的$ http.post()或.get(),則響應將傳遞給$ http.post()。then(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();

這樣你可以請求傳遞到您的瀏覽器來完成,這樣則響應會被瀏覽器中也可以操作。這是您自己或通過瀏覽器執行請求的關鍵區別。如果你自己做了這個請求,那麼瀏覽器不會下載這個對象,但是你會自己接收它來做一些事情。

如果您希望瀏覽器下載對象,那麼請讓瀏覽器也爲對象做請求!

相關問題