我正在尝试上传从相机返回的 jpeg 图像缓冲区。我知道长度,但如果我只将该长度传递给 setFixedLengthStreamingMode() 例程,我会在 logcat 中收到错误,告诉我它需要不同的大小。我不知道这是否是一个 android 错误(我在此设备上运行 2.3.3),或者我应该在 POST 数据之外添加 header 的大小或什么。我可以使用 setChunkedStreamingMode(0) 并且效果很好,但我认为避免复制数据的开销会很好。我似乎总是少了 155 个字节,除非我任意添加 155 个字节,然后它告诉我少了 2 个字节:-)。
最佳答案
默认情况下,URLConnection
缓冲一切 写入客户端内存中的 getOutputStream()
,直到它关闭。这是强制性的,因为需要设置 HTTP Content-Length
响应 header 。但是内容长度只有在所有字节都被写入后才知道。当响应主体相对较大时,这可能会占用内存。
如果您事先知道写入的确切字节数(注意:字节,而不是字符),那么您可以使用 setFixedLengthStreamingMode()
将其设置为恰好字节数,以便可以更快地设置 Content-Length
header ,并且 URLConnection
可以更频繁地刷新。在您的特定情况下,您显然使用了错误的值。
setChunkedStreamingMode()
基本上将传输编码更改为chunked
。这基本上是一行以十六进制代码表示的字节长度,然后是一行写入的字节,然后是一个空行(另请参见 wikipedia )。最后一行的字节长度为 0,因此服务器知道它何时是主体的末尾,因此它不必等待任何传入数据。这允许更频繁地刷新响应主体。你不应该只将它设置为 0,而应该设置一个合理的值,比如 1000 左右。这样每 1000 个写入的字节将作为一个新 block 发送。
另见:
关于android - HttpURL连接 : what does setFixedLengthStreamingMode() want the size of?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105592/