7

我正在尝试上传从相机返回的 jpeg 图像缓冲区。我知道长度,但是如果我只将那个长度传递给 setFixedLengthStreamingMode() 例程,我会在 logcat 中收到错误,告诉我它需要不同的大小。我不知道这是否是一个 android 错误(我在此设备上运行 2.3.3),或者除了 POST 数据或什么之外,我应该添加标题的大小。我可以使用 setChunkedStreamingMode(0) 并且效果很好,但我认为避免复制数据的开销会很好。我似乎总是少了 155 个字节,除非我任意添加 155 个字节,然后它告诉我我少了 2 个字节:-)。

4

1 回答 1

13

URLConnection默认情况下,缓冲区会将写入客户端内存中的所有内容都getOutputStream()缓存起来,直到它关闭。这是强制性的,因为Content-Length需要设置 HTTP 响应标头。但是只有在写入所有字节后才能知道内容长度。当响应主体相对较大时,这可能会占用内存。

如果您事先知道要写入的确切字节数(注意:字节,而不是字符),那么您可以使用该字节数setFixedLengthStreamingMode()来设置它,以便可以更快地设置标头,从而可以更频繁地刷新. 在您的特定情况下,您显然使用了错误的值。Content-LengthURLConnection

基本上将setChunkedStreamingMode()传输编码更改为chunked. 这基本上是一行以十六进制代码表示的字节长度,然后是一行写入的字节,然后是一个空行(另请参见wikipedia)。最后一行的字节长度为 0,因此服务器知道它何时是正文的结尾,因此它不必等待任何传入数据。这允许更频繁地刷新响应主体。您不应仅将其设置为 0,而应使用合理的值,例如 1000 左右。这样,每 1000 个写入字节将作为一个新块发送。

也可以看看:

于 2012-10-28T01:25:44.500 回答