写这个博客之前我并不清楚 ajax请求是下载不了文件的 😅 这段时间在写一个自己的项目,用到了ajax下载文件,请求到了controller层并返回文件下载成功 但是浏览器就是没有反应,找了很多资料以及在网上搜了很多文章,但找到的文章的着重点 还是在controller层对文件的处理上,最后为了验证controller是没有问题的,我就在jsp中直接写了一个form表单提交,可想而知的效果是文件顺利下载下来了,所以反过来想应该是ajax请求的问题,因为我的业务场景是 当用户点击下载按钮时,控制层接收到请求后 先去查询数据,然后拼装成一个Excel文件,把文件上传到服务器,我的想法是由于中间的流程或者说逻辑有些复杂可能会出现一些不可预料的异常 需要反馈给用户,所以这就变成了不仅是下载文件这么简单,如果直接用form表单提交 我就无法展示系统的错误信息。
这中间也发生了这样的异常 java.lang.IllegalStateException: getOutputStream() has already been called for this response;
遇到这样报错的原因是:controller层返回了一个jsp,但是这个请求是 下载文件
返回一个页面时web容器生成的servlet代码中有out.write("") 字符型输出流,但是在写文件到浏览器时 我用response.getOutputStream() 字节型输出流,所以导致了这个冲突
其实这个异常和本次我写这个博客的目的无关 只是我在解决这个业务场景时 原本想到的解决方案但出现了异常也就pass(淘汰)了我这个想法,所以为了让自己以后不会出现相同的问题就随口一说
应对这个场景正确的解决方案:
前端jsp://一个输入框 两个按钮 一个按钮是计算 一个按钮是下载
请输入一个标识符:
js:// 计算的忽略 只看下载
$(function(){