我遇到了一个非常奇怪的问题,但找不到解决方案。
我有一个简单的测试 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 .
最佳答案
正如其他人所指出的,您看到的是一个 block 的开始,即该 block 包含的八位位组的数量。要从 Tcl 客户端处理此问题(而不是通过从 Tomcat POV 关闭分块传输编码),您需要省略 http::geturl
的 -channel
选项>:
package require http;
set testUrl "http://localhost:8080/test/pdf"
set httpResponse [http::geturl "$testUrl"]
fconfigure stdout -translation binary; # turn off auto-encoding on the way out
puts -nonewline stdout [http::data $httpResponse]
这应该正确地将分块内容转变为一 block 。背景是,当我上次检查时,分块内容的处理不适用于 -channel
选项。
关于java - 文件开头的附加 "2000"字符串([32 30 30 30] 字节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51781504/