在我公司的网站上,我们有一些表格需要导出到 csv 文件。
有一些不同的参数,因此需要根据要求动态创建 csv 文件。
我的问题是,点击下载后,响应挂起,等待创建整个文件(这可能需要一些时间),然后才立即下载整个文件。
我正在使用 AngularJS,所以我正在使用 window.location = <url_for_file_download>
为了使浏览器下载文件。
在服务器端,我使用的是 Java Spring,并且我已经按照我可以在 Web 上找到的所有说明来创建文件下载 Controller 。
我的 Controller 代码是这样的:
@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\"");
我还尝试添加以下 header :
response.setHeader("Transfer-Encoding", "Chunked");
response.setHeader("Content-Description", "File Transfer");
而且我还尝试将 Content-type 设置为 "application/octet-stream"
.
请注意,我没有添加 Content-length
header ,因为该文件尚不存在,并且正在即时写入。
为了编写 csv 文件,我使用的是 OpenCSV,我的代码如下:
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)等了好久,一瞬间就下载完了?我该如何解决这个问题。
我希望我已经添加了足够的代码,如果有什么遗漏请告诉我,我会尝试在这里添加它。
非常感谢您。
最佳答案
你能尝试在你的 java 中返回一个 null 值吗
返回空值;
或者你也可以试试下面的代码 1. 点击提交按钮后的jquery代码
$(document).ready( function() {
$('#buttonName').click(function(e){
$("#formName").submit();
//alert("The file ready to be downloaded");
});
});
你的 Controller 代码
@RequestMapping(value="/name",method=RequestMethod.POST)
public ModelAndView downloadCSV(ModelMap model,HttpSession session,@ModelAttribute(value="Pojo") Pojo pojo
,HttpServletRequest request,HttpServletResponse response){
----------------some code----------------
response.setContentType("application/csv");
("application/unknown");
response.setHeader("content-disposition","attachment;filename =filename.csv");
ServletOutputStream writer = response.getOutputStream();
logger.info("downloading contents to csv");
writer.print("A");
writer.print(',');
writer.println("B");
for(int i=0;i<limit;i++){
writer.print(""+pojo.get(i).getA());
writer.print(',');
writer.print(pojo.get(i).getB());
writer.println();
}
writer.flush();
writer.close();
---------------some code-----------
return null;
}
希望对你有帮助
关于Java Spring - 动态生成的 csv 文件下载响应挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669709/