[英]Retrieve large amount of data in Java Web App and download it to client
[英]How to download excel file with large amount of data?
有一個 API 可以下載 Excel 文件。 每當我們點擊“下載 excel 報告”按鈕時,它就會調用這個 API,它從數據庫中獲取數據,將其傳輸到 Excel 文件並下載它。
excelName = key + ".xlsx";
response.setHeader("Content-Disposition", "attachment; filename=" + excelName);
ByteArrayInputStream in = getDownloadBusinessAnalysisKey(key, customerScopeId, response, getBusinessKeyResult, sheetName);
response.setHeader("Content-Length", String.valueOf(in.available()));
try {
FileCopyUtils.copy(in, response.getOutputStream());
} catch (IOException e) {
logger.error("Error in report " + e.getLocalizedMessage());
}
當有大約 10,000 條記錄(或接近它)時,它可以正常下載。
但是,當有大約 100,000 條記錄時,它就不會下載。 我沒有得到端點的響應。 當嘗試通過本地數據庫中的 Postman 下載相同的文件時,它可以工作。
下載大小有限制嗎? 這是瀏覽器、Tomcat 服務器還是 HTTP header 問題?
當您使用ByteArrayInputSteam
時,您會將整個數據加載到 memory 中。 需要做的是讓getDownloadBusinessAnalysisKey
存儲到一個可以stream的地方,通常是一個文件。 然后使用FileInputStream
讀取文件並將其寫入響應 output stream。
根據您使用 API 下載 Excel 文件的聲明,我假設它沒有在您當前的JVM中完成(否則我會建議您重新考慮一下代碼它工作。
從您的代碼示例中,您似乎也在使用基於 setHeader 的 Servlet setHeader
。 所以這里有一些代碼可以建立一個獲取連接並或多或少地代理它。 如果只是直接通過,則不需要臨時文件,也不需要緩沖,除非您可以確認 servlet 引擎沒有為您提供緩沖數據。
protect void doGet(
HttpServletRequest req,
HttpServletResponse response)
throws ServletException, IOException {
var url = new URL("http://myapi");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
int len = con.getHeaderFieldInt("Content-Length",-1);
int contentType = con.getHeaderField("Content-Type", "application/octet-stream");
assert responseCode == 200
response.setIntHeader("Content-Length", len);
response.setHeader("Content-Type", contentType);
try (
InputStream is = con.getInputStream();
OutputStream os = response.getOutputStreeam();
) {
int c = is.read();
while (c != -1) {
os.write(c);
c = is.read();
}
}
}
這可以通過使用 Async Servlet API 來優化,以減少在處理大量連接時需要的阻塞 I/O。
我認為從數據庫獲取數據並提取到 excel 的過程需要很長時間,並且比服務器的最大響應時間長。 您應該調整從 db 獲取數據並提取到 excel 的過程,它將解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.