未知内容长度的HTTP标头

joc*_*ull 23 .net binary streaming http http-headers

我目前正在尝试在转码过程之后将内容流式传输到网络上.这通常可以通过将二进制文件写入我的Web流来正常工作,但是某些浏览器(特别是IE7,IE8)不喜欢不在HTTP头中定义Content-Length.我相信"有效"标题应该具有此设置.

当您有未知的内容长度时,将内容流式传输到网络的正确方法是什么?转码过程可能需要一段时间,所以我想在完成时开始流式传输.

Bal*_*usC 19

尝试将它们与块一起发送.维基百科中的更多细节.Transfer-Encoding: chunked

根据评论进行更新,这里是Java中"ChunkedOutputStream"的示例:

package com.stackoverflow.q2395192;

import java.io.IOException;
import java.io.OutputStream;

public class ChunkedOutputStream extends OutputStream {

    private static final byte[] CRLF = "\r\n".getBytes();
    private OutputStream output = null;

    public ChunkedOutputStream(OutputStream output) {
        this.output = output;
    }

    @Override
    public void write(int i) throws IOException {
        write(new byte[] { (byte) i }, 0, 1);
    }

    @Override
    public void write(byte[] b, int offset, int length) throws IOException {
        writeHeader(length);
        output.write(CRLF, 0, CRLF.length);
        output.write(b, offset, length);
        output.write(CRLF, 0, CRLF.length);
    }

    @Override
    public void flush() throws IOException {
        output.flush();
    }

    @Override
    public void close() throws IOException {
        writeHeader(0);
        output.write(CRLF, 0, CRLF.length);
        output.write(CRLF, 0, CRLF.length);
        output.close();
    }

    private void writeHeader(int length) throws IOException {
        byte[] header = Integer.toHexString(length).getBytes();
        output.write(header, 0, header.length);
    }

}
Run Code Online (Sandbox Code Playgroud)

......基本上可以用作:

OutputStream output = new ChunkedOutputStream(response.getOutputStream());
output.write(....);
Run Code Online (Sandbox Code Playgroud)

您可以在源代码中看到,每个数据块都存在一个标题,表示以十六进制表示的数据长度,CRLF,实际数据和CRLF.流的末尾由表示0长度和两个CRLF的标题表示.

注意:尽管有这个例子,但实际上在基于JSP/Servlet的web应用程序中并不需要它.每当响应上没有设置内容长度时,webcontainer将自动以块的形式传输它们.