无法使用 Apache httpupload 读取多部分流

问题描述 投票:0回答:1

我正在尝试使用此代码从网络摄像头的 MJPEG 流中读取图像帧序列,主要遵循

MultipartStream
顶部的示例用法 javadoc:

    public static void main(String[] args) {
        try {
            HttpURLConnection conn = (HttpURLConnection) new URL("http://....").openConnection();
            conn.setRequestMethod("GET");
            conn.connect();
            if (conn.getResponseCode() != 200)
                throw new RuntimeException("Failed to connect: " + conn.getResponseCode());

            String ct = conn.getHeaderField("Content-Type");
            String bnd = "--" + ct.split("boundary=")[1];
            System.out.println("Boundary is: " + bnd);

            try (InputStream is = conn.getInputStream()) {
                MultipartStream multi = new MultipartStream(is, bnd.getBytes(StandardCharsets.ISO_8859_1), 4096, null);
                boolean next = multi.skipPreamble(); // STUCK HERE
                while (next) {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    multi.readBodyData(baos);
                    processFrame(baos);
                    next = multi.readBoundary();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Chrome 似乎能够成功渲染流,所以我不相信它是无效的流。 它卡在

multi.skipPreamble()
处。 我认为,在内部,它只是无休止地消耗源
InputStream
,而没有找到边界。 不确定我做错了什么。 我尝试将传入流转储到文件中并查看该文件,但在我未经训练的眼睛看来,它看起来没问题:

Start of stream

然后在第一帧的末尾我可以看到这个:

End of first frame

正如预期的那样,这会重复。

java webcam multipart http-upload
1个回答
0
投票

多部分中间的另一个 200 ok(+4 标头)对于多部分来说是不正常的。该网络摄像头的作用更像是一个 http 响应管道。

skipPreamble() 意图应该跳过这些标头,并且不会检测“--myboundary”,因为缺少“--”。

然而,MultipartStream 的来源似乎暂时忽略了所需的“--”。我认为您发现了不那么合法的数据暴露的弱点。不确定他们会修复它。

参见 https://github.com/apache/tomcat/blob/main/java/org/apache/tomcat/util/http/fileupload/MultipartStream.java#L609.

您应该尝试单步执行此代码,看看它是否错误地从意外重复的 4 个标头中获取了重复的boundary=myboundary。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.