java日常問題之excel文件下載功能中getOutputStream() has already been called for this response

erm...在做excel文件下載的時候出現瞭如下列的問題:



然後我在網上找了好久,大部分都是說要加上以下這兩句代碼:


  1. out.clear();  
  2. 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];




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章