如何修改Java/Tomcat中HttpServletResponse参数设置Excel下载文件名称
解决方案
你只需要给HttpServletResponse添加Content-Disposition响应头,明确指定下载文件名即可,浏览器会优先读取该头的配置作为下载文件名,不会再默认使用请求路径的最后一段作为文件名。
修改后的完整代码
@RequestMapping(value="/something/somthingelse.do", method=RequestMethod.POST) public void doSomething(@ModelAttribute ReportModel reportModel, BindingResult bindResult,HttpServletResponse response,Model model) throws Exception{ Workbook reportObj = ReportService.generateExcel(ReportService.getReportData(reportModel.getReportParameters())); response.setContentType("application/vnd.ms-excel"); // 新增这一行配置下载文件名 response.setHeader("Content-Disposition", "attachment;filename=myspreadsheet.xls"); OutputStream out = response.getOutputStream(); HSSFWorkbook workbook = (HSSFWorkbook) reportObj; workbook.write(out); out.flush(); out.close(); }
补充说明
- 头属性里的
attachment表示该响应内容为下载附件,不会直接在浏览器内打开,如果需要浏览器尝试内置打开可以换成inline - 如果文件名包含中文,需要先对文件名做UTF-8编码,避免不同浏览器出现乱码,示例如下:
String cnFileName = URLEncoder.encode("销售报表.xls", "UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + cnFileName);
- 原有代码中已经直接把Excel内容写入了响应输出流,再返回视图名属于冗余操作,部分场景下会导致响应重复写入报错,因此建议把方法返回值改为
void,删除原有的return语句。
内容的提问来源于stack exchange,提问作者user1071914
相关产品推荐
相关产品推荐

