我有一个非常奇怪的问题,我找不到解决方案。
我有一个简单的测试 servlet,它在响应中流式传输一个小的 pdf 文件:
public class TestPdf extends HttpServlet implements Servlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
File file = new File(getServletContext().getRealPath("/lorem.pdf"));
response.setContentType("application/pdf");
ServletOutputStream out = response.getOutputStream();
InputStream in = new FileInputStream(file);
byte[] bytes = new byte[10000];
int count = -1;
while ((count = in.read(bytes)) != -1) {
out.write(bytes, 0, count);
}
in.close();
out.flush();
out.close();
}
}
如果我用浏览器、curl、wget 调用 servlet url,一切都很好,但是当我用这样的简单 TCL 脚本调用它时:
#!/usr/bin/tclsh8.5
package require http;
set testUrl "http://localhost:8080/test/pdf"
set httpResponse [http::geturl "$testUrl" -channel stdout]
该文件的开头有一个“2000”字符串破坏了pdf。
该问题似乎与 Tomcat 或 JDK 版本无关,因为我能够在我的开发环境(Ubuntu 16.04)上使用 JDK 1.5.0_22 Tomcat 5.5.36 和 JDK 1.8.0_74 和 Tomcat 8.5.15 重现它。