【发布时间】:2015-12-15 14:53:36
【问题描述】:
我使用以下 REST 处理程序将文件传输到客户端。
我故意打电话给response.flushBuffer(),希望我应该被阻止写入响应,因为它已经提交了。而且我希望客户不会收到完整的文件。
但整个文件仍会发送给客户端。并且不会抛出关于 Response Already Committed 的异常。
为什么?
我的代码:
@RestController
public class ChunkedTransferAPI {
@Autowired
ServletContext servletContext;
@RequestMapping(value = "bootfile.efi", method = { RequestMethod.GET, RequestMethod.HEAD })
public void doHttpBoot(HttpServletResponse response) {
String filename = "/realbootfile.efi";
try {
ServletOutputStream output = response.getOutputStream();
InputStream input = servletContext.getResourceAsStream(filename);
BufferedInputStream bufferedInput = new BufferedInputStream(input);
int datum = bufferedInput.read();
while (datum != -1) {
output.write(datum);
datum = bufferedInput.read();
response.flushBuffer(); // <======= HERE
}
//output.flush();
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
【问题讨论】:
-
为什么不使用 Outputsteam 的其他替代方法:public void write(byte b[], int off, int len),这样您就可以随心所欲地写入数据
-
@SercanOzdemir 感谢您的提醒。我只是为了好玩而尝试。 :)
标签: java spring rest spring-mvc web