Android中基于Socket方式的文件上传
来源:互联网 发布:软件开发方案书 编辑:程序博客网 时间:2024/06/06 16:37
问题描述:
需求: 图片上传到服务器中. 在浏览器中测试可以通过。 证明服务器端没有问题. 但在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)) {
需求: 图片上传到服务器中. 在浏览器中测试可以通过。 证明服务器端没有问题. 但在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();
通过这个调试,可以确定问题出在了客户端, 为什么会丢失参数呢?
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();
请注意红色代码部分: 原本我是想获取到如下的协议: 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() );
解决问题还是须要心静。 仔细观察( 看来我还能坐得住).
0 0
- Android中基于Socket方式的文件上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传 .
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- Android中Socket大文件断点上传
- 基于servlet的方式实现文件上传
- 基于servlet的方式实现文件上传
- 基于servlet的方式实现文件上传
- Android中Form Post方式提交,上传文件的实现
- Android基础—基于Socket实现上传大文件
- 如何处理iOS中照片的方向
- 梯度下降法1
- 日经社説 20150605 日中韓FTAは高い水準の合意めざせ
- clang编译luabind项目报错和tcmalloc内存释放
- Java中栈的实现
- Android中基于Socket方式的文件上传
- 从今天开始记录一下每天学到的Android知识、以及开发中遇到的问题
- 社説 20150605 那覇離着陸ミス 管制官との交信解析がカギだ
- lucene 使用教程
- 在Mac OS X上安装Git
- 二维快速傅里叶变换及滤波
- 社説 20150605 日比首脳会談 平和と繁栄へ協調を続けたい
- 只要你想 并为之努力 你就能!
- sed 修连接文件,有坑