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将自动以块的形式传输它们.