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)) {

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()    ); 


          解决问题还是须要心静。 仔细观察( 看来我还能坐得住).  

0 0
原创粉丝点击