getOutputStream() has already been called for this response
时间: 2023-07-20 08:33:55 浏览: 93
java response 下载文件方法
5星 · 资源好评率100%
在使用 Servlet 进行文件下载时,如果出现 "getOutputStream() has already been called for this response" 的异常信息,通常是因为在设置了响应头信息后,又尝试获取了输出流,这是不被允许的。
这个问题的根本原因是在设置响应头信息时,Servlet 已经使用了输出流,而获取输出流的操作又会尝试使用输出流,因此就会抛出异常。
解决这个问题的方法是,先设置响应头信息,再获取输出流。例如,在下载文件时,可以先设置响应头信息,再获取输出流进行写入操作,示例代码如下:
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = "D:\\example.txt";
File file = new File(filePath);
String fileName = file.getName();
// 设置响应头信息
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 获取输出流
OutputStream out = response.getOutputStream();
FileInputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
```
在上面的代码中,先设置了响应头信息,然后再获取输出流进行文件写入操作,这样就可以避免 "getOutputStream() has already been called for this response" 的异常了。
阅读全文