java - 文件开头的附加 "2000"字符串([32 30 30 30] 字节)

标签 java tomcat servlets tcl activetcl

我遇到了一个非常奇怪的问题,但找不到解决方案。

我有一个简单的测试 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/

相关文章:

java - 404错误使用tomcat 6 for spring mvc

java - OSGi ServiceTracker 中的漂亮 URL

java - 在/* 上映射全局前端 Controller servlet 时如何访问静态资源

java - 使用 <jsp :include> to make a servlet call that returns additional <jsp:include >'s, but they' re not being rendered

java - ListView 加载速度更快

java - 如何在 Java 中执行 SQL 脚本文件?

使用 Ant 取消部署/部署 Tomcat

java - AndroidPlot:检测点上的触摸事件

java - Android:Firebase 实时数据库聊天中签名 apk 的消息键已更改

java - dispatcher.forward() 产生 HTTP 500