亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Java Servlet中流式傳輸大文件

在Java Servlet中流式傳輸大文件

慕少森 2019-12-11 15:09:41
我正在構建需要擴展的Java服務器。Servlet之一將提供存儲在Amazon S3中的圖像。最近在負載下,我的VM內存不足,這是在我添加了用于提供圖像的代碼之后,因此,我很確定流較大的servlet響應會引起我的麻煩。我的問題是:從數據庫或其他云存儲讀取數據時,如何編寫Java Servlet以便將大型(> 200k)響應流回瀏覽器,是否有最佳實踐?我考慮過將文件寫入本地臨時驅動器,然后生成另一個線程來處理流,以便可以重新使用tomcat servlet線程。這似乎很沉重。任何想法將不勝感激。謝謝。
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

如果可能,您不應將要提供的文件的全部內容存儲在內存中。取而代之的是,為數據獲取InputStream,并將數據分段地復制到Servlet OutputStream。例如:


ServletOutputStream out = response.getOutputStream();

InputStream in = [ code to get source input stream ];

String mimeType = [ code to get mimetype of data to be served ];

byte[] bytes = new byte[FILEBUFFERSIZE];

int bytesRead;


response.setContentType(mimeType);


while ((bytesRead = in.read(bytes)) != -1) {

    out.write(bytes, 0, bytesRead);

}


// do the following in a finally block:

in.close();

out.close();

我確實同意toby,您應該改為“將它們指向S3 url”。


至于OOM異常,您確定它與提供圖像數據有關嗎?假設您的JVM具有256MB的“額外”內存,可用于提供圖像數據。在Google的幫助下,“ 256MB / 200KB” =1310。對于2GB的“額外”內存(目前這是一個非常合理的數量),可以支持10,000個并發客戶端。即便如此,1300個并發客戶端仍然是一個很大的數目。這是您經歷過的負載類型嗎?如果不是,則可能需要在其他地方查找OOM異常的原因。


編輯-關于:


在這種情況下,圖像可能包含敏感數據...


幾周前閱讀S3文檔時,我注意到您可以生成可以附加到S3 URL的過期密鑰。因此,您不必公開S3上的文件。我對這項技術的理解是:


初始HTML頁面具有指向您的Web應用程序的下載鏈接

用戶點擊下載鏈接

您的Web應用程序會生成一個S3 URL,其中包含一個密鑰,該密鑰將在5分鐘內過期。

使用步驟3中的URL將HTTP重定向發送到客戶端。

用戶從S3下載文件。即使下載時間超過5分鐘,此方法仍然有效-下載開始后,它就可以繼續完成。



查看完整回答
反對 回復 2019-12-12
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

您為什么不只將它們指向S3網址?從S3中獲取工件,然后通過您自己的服務器將其流式傳輸給我,這使使用S3的目的無法實現,后者是將帶寬和將圖像提供給Amazon的處理工作卸載了。


查看完整回答
  • 3 回答
  • 0 關注
  • 474 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號