java中用response.getOutputStream()实现文件下载,但报错(抛出异常)

getOutputStream() has already been called for this response

在查找解决方案的时候发现一个值得参考的答案:

在你下载的jsp末尾写

response.reset();

out.clear();

out=pageContext.pushBody();

若这时又包错

java.lang.IllegalStateException

at org.apache.catalina.connector.ResponseFacade.reset(ResponseFacade.java:310)

at org.apache.jsp.jsp.util.temp_jsp._jspService(temp_jsp.java:95)………

则只加后两句即可:

out.clear();

out=pageContext.pushBody();

------------------------------------------------文件下载jsp参考源代码----------------------------------------------------

int bytesum=0;

int byteread=0;

String u =(String)request.getAttribute("url");

if(u==null){

u =(String)request.getParameter("url");

}

//System.out.println("huxy:"+u);

URL url = new URL(u);

//截取文件地址以获得文件名

int count = u.lastIndexOf("/");

int countl = u.lastIndexOf(".");

String f_name = u.substring((count+1),(countl));

String l_name = u.substring((countl+1),u.length());

URLConnection conn = url.openConnection();

InputStream inStream = conn.getInputStream();

response.reset();//写文件头

ServletOutputStream fs = response.getOutputStream();

String fileName= f_name + "." + l_name;

fileName = new String(fileName.getBytes(),"ISO-8859-1");

response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

response.setContentType("bin;charset=iso8859_1");

byte[]  buffer =new  byte[1444];

while ((byteread=inStream.read(buffer))!=-1)

{

bytesum+=byteread;

fs.write(buffer,0,byteread);

}

inStream.close();

fs.flush();

fs.close();

u=(String)request.getAttribute("fileurl");

File strFile=new File(u);

if(strFile!=null){

strFile.delete();

}

// response.reset();

out.clear();

out=pageContext.pushBody();

%>

注意需要将被下载文件的绝对路径使用url参数传递到该jsp中,如上 u = “file:D:/workspace/BIPortal2/file/hhh15501.xls”;(注意:字符串中有个file:)

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐