问题描述:
需求: 图片上传到服务器中. 在浏览器中测试可以通过。 证明服务器端没有问题. 但在android端上传时不行。
思考有可能出问题的点:
1. 因为是文件上传时,http协议中文件长度的计算是否有误
2. 因为使用的是socket方式,http请求完全要手工拼接,所以拼接http协议的部分是否有问题.
3. android端能否调用到服务器中的 Servlet, 这是一个关键点,如果能调用到,证明请求没有问题. 如果调用不到,则证明android端的问题.
解决思路:
1. 将androidu端的代码最小化,只留下了上传文件一个部分,其它的参数去掉.
2. 仔细检查协议的拼接部分,没有问题.
3. 在服务器中设置了一个断点,断点位置在servlet中的dopost方法的第一句话中,经过调试跟踪,发现客户端能联接上来,但随着断点向下运行,注意到 在以下红色代码处,没有进行addOp方法. 而我的请求地址写的是:
http://192.168.1.103/testfileupload/uploadfile.action?op=add, 按道理应该进入 addOp方法运行。 但观察变量的值发现没有op这个参数,即这个参数丢失了。 而我们知道,我是在地址栏中通过get方式将这个op参数传过来的,而没有通过 post实体部分(如果是在实体中,则使用request无法直接获取). ,应该可以获取得到。
if
(op !=
null
&& !
""
.equals(op)) {
if ("add".equals(op)) {
addOp(request, response);
}
} else
}
通过这个调试,可以确定问题出在了客户端, 为什么会丢失参数呢?
4. 断点调试android客户端代码:
a. 调用部分OK
wu.postFileToServer(
"http://192.168.1.103/testfileupload/uploadfile.action?op=add"
,
null
, ufs);
b. 发送请求头的部分:
OutputStream oos= socket.getOutputStream();
String requestFirstWord="POST "+url.getPath()+" HTTP/1.1"+BREAKLINE; //
oos.write(
requestFirstWord.getBytes()
);
请注意红色代码部分: 原本我是想获取到如下的协议:
POST /
testfileupload/uploadfile.action?op=add
HTTP/1.1
但观察变量得到的却是:
POST /
testfileupload/uploadfile.action
HTTP/1.1
, 瞬间 。。。。。(此处心情复杂)
url.getPath()只获取到了 请求的路径,但并不会获取到请求的参数部分。 所以在发送post请求时, op=add并没有发送. 服务器端接收不到,所以没有调用addOp()方法.
问题找到了,解决方案就出来了:
OutputStream oos= socket.getOutputStream();
String queryString=url.getQuery(); //取出请求参数.
String requestFirstWord="POST "+url.getPath()+"?"+queryString+" HTTP/1.1"+BREAKLINE; // POST /res/yyyback/backfood.action?op=add HTTP/1.1
oos.write( requestFirstWord.getBytes() );
解决问题还是须要心静。 仔细观察( 看来我还能坐得住).