Android HttpURLConnection:setFixedLengthStreamingMode()想要的大小是多少?

Android HttpURLConnection:setFixedLengthStreamingMode()想要的大小是多少?,android,http,image-uploading,Android,Http,Image Uploading,我正试图上传一个jpeg图像缓冲区,我从相机上取回的。我知道长度,但是如果我只将该长度传递给setFixedLengthStreamingMode()例程,我会在logcat中得到错误,告诉我它需要不同的大小。我不知道这是不是安卓的错误(我在这个设备上运行的是2.3.3),或者我应该在POST数据之外添加标题的大小,或者什么。我可以使用setChunkedStreamingMode(0),这很好,但我认为最好避免复制数据的开销。我似乎总是关闭155个字节,除非我任意添加155个字节,然后它告诉我

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

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

如果您事先知道写入的确切字节数(注意:字节,而不是字符),则可以使用
setFixedLengthStreamingMode(),这样可以更快地设置
内容长度
标题,并且
URLConnection
可以更频繁地刷新。在您的特定情况下,您显然使用了错误的值

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

另见:

是的,我最终发现它想要的是我将要编写的所有内容的总大小()。我构建了一个前缀和后缀缓冲区,这样我就可以询问要传递给setFixedLengthStreamingMode()的所有内容的长度,它终于开始工作了。@BalusC默认情况下,
缓冲区是什么意思。。。在服务器的内存中,直到它关闭为止
?“服务器内存”是指手机内存(或者更具体地说是指应用程序分配的内存堆)?我这样问是因为,如果您在多部分/表单数据中上载一个大型图像文件,整个图像和表单数据头是否会缓冲在堆/电话内存中,从而可能导致OOM问题?除非您预先确定表单数据头和图像的字节长度,然后使用
setFixedLengthStreamingMode()
?@Turbo:对不起,我在回答中混用了服务器和客户端。我已经修好了。@BalusC你知道为什么
setChunkedStreamingMode()
可能不起作用吗。我需要使用它,但当设置时,我的服务器没有收到任何数据,只需调用我的api方法:@BalusC-您说“您不应该将其设置为0,而是应该设置一个合理的值,例如1000左右。这样,每1000个写入字节将作为一个新块发送。”我认为最好的做法是将其设置为0,以便使用平台默认值。为什么不是0?