在我公司的網站上,我們有一些需要導出到csv文件的表格。
有一些不同的參數,因此需要根據請求動態創建csv文件。Java Spring - 動態生成的csv文件下載響應掛起
我的問題是,單擊下載後,響應會掛起,並等待創建整個文件(可能需要一些時間),然後纔會立即下載整個文件。
我使用AngularJS,所以我使用window.location = <url_for_file_download>
爲了使瀏覽器下載文件。
在服務器端,我使用Java Spring,並且遵循了我可以在網上找到的所有說明來創建文件下載控制器。
我的控制器代碼是這樣的:
@RequestMapping(value = "http://yada.yada.yada/csv/myFile.csv", method = RequestMethod.GET)
public @ResponseBody
void getCustomers(HttpServletResponse response,
@RequestParam(required = false) String someParameters)
throws NotAuthorizedException, IOException {
// set headers
setHeaders(response);
// generate writer
CSVWriter write = generateWriter(response);
// get data
List<String[]> data = getData();
// write and flush and all that
.
.
.
}
我設置應答頭碼是:
response.setContentType("text/csv;charset=utf-8");
response.setHeader("Content-Disposition","attachment; filename=\"" + fileName + ".csv\"");
我也嘗試添加以下標題:
response.setHeader("Transfer-Encoding", "Chunked");
response.setHeader("Content-Description", "File Transfer");
我也嘗試將內容類型設置爲"application/octet-stream"
。
請注意,我不添加Content-length
標頭,因爲該文件尚不存在,並且正在寫入。
對於寫作我使用OpenCSV csv文件,我的代碼如下:
OutputStream resOs = response.getOutputStream();
OutputStream buffOs = new BufferedOutputStream(resOs);
OutputStreamWriter outputWriter = new OutputStreamWriter(buffOs,"UTF-8");
CSVWriter writer = new CSVWriter(outputWriter);
我遍歷數據,並將其寫入像這樣:
for (String[] row: data) {
writer.writeNext(line);
}
(這不完全代碼 - 但這更否則代碼會發生什麼)
,並在結束時,我刷新並關閉:
writer.flush();
writer.close();
我也嘗試在每行寫入後刷新。
那麼爲什麼不是在文件全部被寫入之前被傳輸? 爲什麼我的瀏覽器(Google Chrome)在長時間等待後立即下載文件?我該如何解決這個問題。
我希望我已經添加了足夠的代碼,如果有什麼缺失,請告訴我,我會嘗試在這裏添加它。
非常感謝你提前。
是設置響應,並在控制器寫入responseoutput流的碼? – 2015-02-23 09:01:50
@PaulJohn是的,抱歉,如果不明確。但我確實使用了一些幫助函數,我將httpServletResponse對象傳遞給它,以便設置標題並創建編寫器。我將編輯該問題。 – 2015-02-23 09:05:15
@jonnybordo您是否找到了解決此問題的解決方案?我有同一個。 – medvedev1088 2016-12-22 14:34:00