erm...在做excel文件下載的時候出現瞭如下列的問題:
然後我在網上找了好久,大部分都是說要加上以下這兩句代碼:
- out.clear();
- out = pageContext.pushBody();
但是呢,我的這個狀況並不是在前臺插入了java代碼,
@RequestMapping("/downLoad")
public void downLoad(HttpServletRequest req,HttpServletResponse res) throws IOException{
//獲取要下載的模板名稱
String fileName = req.getParameter("fileName");
res.setHeader("Content-disposition","attachment;fileName="+fileName);
//通知客服文件的MIME類型
res.setContentType("application/vnd.ms-excel;charset=UTF-8");
//獲取路徑
String filePath = req.getSession().getServletContext().getRealPath("/WEB-INF/file")+"/"+fileName;
filePath = filePath.replace("\\", "/");
File file = new File(filePath);
InputStream input = new FileInputStream(filePath);
OutputStream out =res.getOutputStream();
byte[] b = new byte[(int)file.length()];
int len;
while((len=input.read(b))!=0){
out.write(b,0,len);
}
input.close();
}
所以,出現getOutputStream() has already been called for this response這個問題的原因之一可能是len在讀完數據之後爲-1,而我這裏的是不等於0,所以它又會進入while循環,但此時已經沒有東西可以讀了。
所以將(len=input.read(b))!=0改成(len=input.read(b))!= -1就好了,還有我這次的excel文件是先獲取文件的長度再一次性讀取的,這樣當文件過大的時候可能內存就會崩潰了,以後得改成
byte b = new byte[2048];