java中的response和outputstream_java中用response.getOutputStream()实现文件下载

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:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Java 使用 `response.getOutputStream()` 下载文件并添加一层文件夹,可以按照以下步骤进行: 1. 设置响应头 在使用 `response.getOutputStream()` 下载文件时,需要设置响应头,包括文件名、文件类型等信息。在这里,我们需要设置一个 Content-Disposition 头部,用于指定浏览器下载文件时的文件名和保存方式。同时,我们可以在文件名前添加一个文件夹名称,以实现添加一层文件夹的效果。示例代码如下: ``` String fileName = "example.txt"; String folderName = "downloads"; String contentType = "application/octet-stream"; response.setHeader("Content-Disposition", "attachment;filename=" + folderName + "/" + fileName); response.setContentType(contentType); ``` 2. 获取文件流 接下来,我们需要获取要下载的文件的输入流。在这里,我们使用 `FileInputStream` 类来获取文件流。示例代码如下: ``` String filePath = "example.txt"; File file = new File(filePath); InputStream inputStream = new FileInputStream(file); ``` 3. 入响应流 最后,我们将文件入响应流,以实现下载文件的功能。在这里,我们使用 `ServletOutputStream` 类来获取响应流,并使用 `IOUtils` 类将文件入响应流。示例代码如下: ``` ServletOutputStream outputStream = response.getOutputStream(); IOUtils.copy(inputStream, outputStream); outputStream.flush(); outputStream.close(); inputStream.close(); ``` 以上代码将在浏览器下载一个名为 `downloads/example.txt` 的文件,其 `example.txt` 是要下载的文件名,`downloads` 是添加的文件夹名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值