0

以下是用於發送文件的HttpServletResponse頭和內容類型。高達32MB的數據傳遞給客戶端,但我的整個數據大小爲100MB。如何通過Http Servlet響應發送大文件

response.setContentType("application/octet-stream"); 
response.setHeader("Transfer-Encoding", "chunked"); 
response.setHeader("Content-Disposition", "attachment; filename="filename.bin"); 

我不能將這些數據存儲到雲存儲中,因爲這是爲每個用戶創建的。

這是否可以通過HttpServletResponse實現?或者我需要移動到其他方法,例如套接字等。

請推薦一種適用於多客戶端環境的方法。

+0

嗨@Brainislav我正在使用谷歌應用程序引擎來實現這一點。需要GAE標籤才能看到。 – SetV

+0

這是否(32MB的問題)發生在任何瀏覽器,或只是與特定的一個。設置「Content-Length」標題可能很有用。另請參閱http://stackoverflow.com/questions/685271/using-servletoutputstream-to-write-very-large-files-in-a-java-servlet-without-me –

+0

您應該通過API設置分塊傳輸模式,不是這樣。除非通過API告訴它,否則它實際上不會進行任何分塊。 – EJP

回答

1

App引擎擁有配額,旨在保護每個人免受失控應用程序的侵害。您的應用程序在單個入站HTTP請求中可以接收的最大數據量爲32MB。

如果你想上傳大文件,那麼你應該看看Blobstore API

查看quota documentation瞭解更多詳情。

+0

嗨@jarmod,我明白了你的觀點。我想下載生成的數據,是否有類似Blobstore/Cloud Storage的工作?如果你有想法,請分享。 – SetV

+0

如果您想上傳或下載大文件,那麼我認爲您應該使用GCS,並且您的客戶端應該直接與GCS服務進行交互以進行上傳/下載。在下載的情況下,您的應用服務器可以創建一個有時間限制的簽名URL,將其提供給客戶端,然後客戶端可以從GCS直接安全地下載文件。您應該避免讓您的應用服務器充當代理服務器,以便上傳到GCS和從GCS下載。 – jarmod

1

您無法繞過32mb的請求限制。您最好的選擇是將數據推送到GCS,並生成一個signed URL

根據您需要做什麼來生成100MB文件,您可能需要使用任務隊列卸載整個進程以防止請求超時。