通过前一篇转载的博文,已经可以实现上传图片、文件等。不过当时是在本地服务器,当我将PHP代码放到租用的虚拟主机的时候,就出现问题了。我POST请求在服务器那边获取不到任何数据。也就是说 $_POST 和 &_FILES 都是空的。而测试POST到本地的服务器,又很正常。这就很奇怪了。
为了确实是什么问题,我是这么做的:
我写了一个HTML的form表单,提交到远程服务器上,没问题。
然后用Fiddler抓包软件,抓取HTML的表单请求包和Android发送的请求包,对比。看看有什么不一样。
最后发现,在请求包里有
Transfer-Encoding: chunked
的时候,服务器就获取不到参数。
当没有
Transfer-Encoding: chunked
而有
Content-Length: xxx
的时候就没问题
然后回头看看Android的代码,将
//这句注释掉。并记录整个请求包的大小,设置一下
//httpURLConnection.setChunkedStreamingMode(128 * 1024);
httpURLConnection.setRequestProperty("Content-Length", ""+Data.length);
就好了。
不知道为什么租用的虚拟主机不支持,害得我调试了好久。还有之前的RSA生成、长链接的实现,都受虚拟主机限制的影响。
Transfer-Encoding: chunked 表示使用分块传输编码这一机制,只在 HTTP1.1里才有。
可以不事先确定整个Request包的大小,而是将数据分块发送。
在Body中就是 一个十六进制的数字表示接下来的包的长度,然后包的内容
Request的结束就是当分块包的长度为0。比如:
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
25
This is the data in the first chunk
1C
and this is the second one
3
con
8
sequence
0