我想上传一个JPEG图像缓冲区我从相机回来。 我所知道的长度,但如果我通过只是长度与setFixedLengthStreamingMode()函数,我得到的logcat的错误,告诉我,它与预期不同的尺寸。 我不知道这是否是一个机器人的错误(我运行该设备上的2.3.3),或者我应该在头的尺寸增加除了POST数据或内容。 我可以使用setChunkedStreamingMode(0),并且工作正常,但我想这将是很好的避免复制数据的开销。 我似乎永远是关除非我随意在155个字节增加155个字节,然后它告诉我,我是2个字节。:-)。
Answer 1:
该URLConnection
由被写入到其默认一切缓冲区getOutputStream()
直到它的关闭在客户端的内存。 这是必须的,因为HTTP Content-Length
响应头需要设置。 但内容长度只知道一旦所有字节都被写入。 这可能是存储器时响应主体是比较大的拱。
如果你事先知道的确切字节量(注:字节,而不是字符)被写入,那么你可以使用setFixedLengthStreamingMode()
与字节的正是量设置,使Content-Length
头可以更快设置和使URLConnection
可以更经常地刷新。 你的具体情况,你显然是使用了错误的值。
所述setChunkedStreamingMode()
基本上改变了传输编码以chunked
。 这基本上是与十六进制编码的字节长度的一个行,然后一个写入的字节therafter的一行,然后一个空行(也参见维基百科 )。 最后一行是0字节长度,因此服务器知道它是身体的末尾,以便它没有等待任何输入数据。 这使得被刷新响应主体更加频繁。 您应该只不设置为0,但有一个合理的值,如1000左右。 这样,每1000点写入的字节将被作为一个新块。
也可以看看:
- 使用java.net.URLConnection中的火灾和处理HTTP请求
文章来源: HttpURLConnection: what does setFixedLengthStreamingMode() want the size of?