我有一个负责 Excel 下载的 Controller 方法:
@RequestMapping(value = "/report/user", method = RequestMethod.GET)
public void getUserReport(@RequestParam(value = "name", required = false) String user,
@RequestParam(value = "startdate", required = false) String startDate,
@RequestParam(value = "enddate", required = false) String endDate,
HttpServletResponse response) {
List<Survey> userSurveys = surveyService.findUserSurveys(user, startDate, endDate);
String userFileName = nameService.getUserFileName(user, startDate, endDate);
Workbook userExcelReport = excelReportGenerator.createUserExcelReport(userSurveys);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=" + userFileName + ".xlsx");
try {
userExcelReport.write(response.getOutputStream());
} catch (IOException e) {
logger.error("The excel workbook could not write to the outputStream ", e);
}
}
正如你所看到的,这个 Controller 映射正在存储一个 Excel 工作簿(在 apache poi 中完成)并设置标题和内容类型,在 google chrome 中这完美地工作,但在 firefox 中该文件被下载为没有扩展名的"file" (但数据是正确的,就像我用 Excel 打开文件一样),并且名称构建错误,就像在 chrome 中一样,这完全正常,我认为 Firefox 中的响应工作方式有问题,任何人都知道什么我可能做错了吗?
最佳答案
根据RFC 6266文件名值
是 token
或引用字符串
。
token
不得包含分隔符
。但空格是一个分隔符
。因此您必须使用带引号的字符串
。
所以尝试一下
response.setHeader("Content-Disposition", "attachment; filename=\"" + userFileName + ".xlsx\"");
关于java - Chrome 和 Firefox 中的 httpServletResponse 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867690/