Android上传文件,续

3 篇文章 0 订阅

通过前一篇转载的博文,已经可以实现上传图片、文件等。不过当时是在本地服务器,当我将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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值