Java Spring - 动态生成的 csv 文件下载响应挂起

标签 java spring csv opencsv

在我公司的网站上,我们有一些表格需要导出到 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/

相关文章:

.net - 使用 powershell 解析逗号分隔的文件

C# 如何根据字符串内容在自定义名称的文件上写入?

java - 使用正则表达式分割数字和表达式

java - 哪个字符串始终具有正的compareTo 返回值,无论它与哪个其他字符串进行比较?

java - 非流上下文中使用java.util.Function的设计实践

java - 基于配置文件的 Spring 数据中实体的附加过滤器

spring - jdbc-initialize-database 找不到脚本文件 - DataAccessResourceFailureException

java - Spring Data/Hibernate native 查询返回 null,即使实际查询返回结果

java - Spark on Java - 在所有工作人员上拥有静态对象的正确方法是什么

Azure 数据工厂 - 读取 JSON 数组并写入单个 CSV 文件