目录(?)[-]

  1. 建立测试环境
  2. 开发环境导入第三方JAR
  3. HTTP Post Multipart小例子

HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件。HTTP Post支持携带body,content-type为multipart。本次我们将尝试通过http post上传一个小文件。

建立测试环境

上传文件的测试环境很难找,下载了Tomcat,想装一个环境,打开后,发现忘得也差不多,要看帮助,比较麻烦,下面是我上传文件到189网盘抓的包,上传一个图片文件,整个content长度为39K。网盘很难作为测试环境的原因是,我们必须完成登录等一系列操作。我们只是需要验证一下小例子,可以简单通过抓包来判断,预计web server会返回4xx或5xx的错误,但这不影响我们的实验。

开发环境:导入第三方JAR

但是目前Andriod的HttpClient并不直接支持multipart,我们需要三个额外的jar来支持:Apache Commons IO,Mime4j,以及HttpMime。可以通过下面地址来下载,也会附到我们所提供的小例子源代码中。http://commons.apache.org/proper/commons-io/http://james.apache.org/mime4j/,以及http://hc.apache.org/index.html。这些jar要最终打包在apk中,应用才能在设备中运行。

在以前的ADT版本中,可以在相应的Project按右键,参见Android学习笔记(四四):第三方Java库的使用。选择Properties,进去后选择Java Build Path,然后选择Libaraies,点击Add External JARs就添加。但是在最新的版本中,采用这种方式在编译中正常,在运行时会报NoClassDefFoundError,如下。

原因是,这些Jar包并没有真正打入apk中。在新的ADT,我们直接将相应的jar包拷贝到project下面的libs/的目录,然后在Eclipse中点击libs/,按右键,选择刷新即可。我们在libs/和Android Private Libraries/中都可以看到相应的jar,如下图所示:

如果我们导入的是最新httpmime-4.3.1.jar,需要将httpcore-4.3.jar同时导入,在接下来的代码编写使用到InputStreamBody数据类型,InputStreamBody会使用到httpcore的类,否者运行时会报org.apache.http.entity.ContentType cannot be resolved的错误。

HTTP Post Multipart小例子

HTTP Post Multipart也是HTTP Post的例子,和之前的小例子相比,只是设置HTTP参数不同,本例子将设置multipart参数。下面截去例子中的部分,如何读response与之前的相同,不再重复。

private HttpResponse multiPartTest() throws Exception{  
    try{              
        HttpClient client = new DefaultHttpClient(); 
        HttpPost request = new HttpPost("http://upload.cloud.189.cn/v5/v5webUploadSmallFileActionl"); 
             
        //设置HTTP参数,本例设置Multipart参数 
        //(1)上传文件readme.txt已经放在asset/下,获取该文件的ContentBody。如果是在存贮中某个目录下,可以用FileBody fb = new FileBody(File f)来得到该ContentBody。
        InputStream is = this.getAssets().open("readme.txt");  
        byte[] data = IOUtils.toByteArray(is);                
        InputStreamBody isb = new InputStreamBody(new ByteArrayInputStream(data), "myUpload");               
        //(2)除了文件外,我们再附加两个参数,生成这两个参数的ContentBody
        StringBody sb1 = new StringBody("some text goes here");  
        StringBody sb2 = new StringBody("some text goes here, too");  
       //(3)作为multipart参数,加入到request中 
        MultipartEntity multiEntity = new MultipartEntity();  
        multiEntity.addPart("myUpload", isb);     
        multiEntity.addPart("one",sb1);  
        multiEntity.addPart("two",sb2);               
        request.setEntity(multiEntity);  
//在上个例子中setEntity()里的参数是UrlEncodedFormEntity本次是MultiPartEntity
               
        return client.execute(request);               
    }catch(Exception e){  
        throw e;  
    }  
}

回头说说调测环境,我们在网上找来一个http server,本例是189网盘,向其发送http post multipart请求,由于我们没有进行网盘用户登录的过程,而参数也非189所指定,因此收到到404消息的reponse。但我们可以通过抓包工具来查看各参数的填入情况,来了解如何在Android中填构multipart。本例我们在multipart entity中加了三个参数,让我们看看request包。

如果我们在机器上状态tomcat apache来搭建测试环境,需要注意的是在模拟器中不能使用127.0.0.1来指向机器的tomcat server,那会指向模拟器本身,要使用网卡的地址。

本博文涉及的例子代码,可以在Pro Android学习:Http service小例子中下载。

相关链接: 我的Android开发相关文章

【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart的更多相关文章

  1. 【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜 广播接 ...

  2. 【转】 Pro Android学习笔记(九四):AsyncTask(3):ProgressDialog

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Progress Dialog小例子 我们 ...

  3. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

  4. 【转】 Pro Android学习笔记(九三):AsyncTask(2):小例子

    目录(?)[-] 继承AsyncTask UI操作接口 使用AsyncTask 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn. ...

  5. 【转】Pro Android学习笔记(九):了解Content Provider(下下)

    Content provider作为信息的读出,比较常见的还有文件的读写,最基础的就是二进制文件的的读写,例如img文件,音频文件的读写.在数据库中存放了该文件的路径,我们可以通过ContentPro ...

  6. 【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 对于activity,消息是在OnCrea ...

  7. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  8. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  9. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  10. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

随机推荐

  1. 【python】-- 装饰器、迭代器、生成器

    装饰器 装饰器本质是函数,是用来装饰其他函数,顾名思义就是,为其他的函数添加附件功能的. 一.装饰器原则: 不能修改被装饰函数的源代码 不能修改被装饰函数的调用方式 def logging(): pr ...

  2. centos7 mysql允许远程连接设置

    Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...

  3. wecenter 问答社区 dockerfile,不用纠结于物理机的运行环境

    FROM webdevops/php-nginx:centos-7-php56 ADD . /app RUN ["chmod", "777", "/a ...

  4. python 安装anaconda, numpy, pandas, matplotlib 等

    如果没安装anaconda,则这样安装这些库: pip install numpy pip install pandas pip install matplotlib sudo apt-get ins ...

  5. Jquery的parent和parents(找到某一特定的祖先元素)用法(转发:https://blog.csdn.net/cui_angel/article/details/7903704)

    <!-- parent是指取得一个包含着所有匹配元素的唯一父元素的元素集合. parents则是取得一个包含着所有匹配元素的祖先元素的元素集合(不包含根元素).可以通过一个可选的表达式进行筛选. ...

  6. C语言程序设计50例(经典收藏)之1

    题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. #includ ...

  7. 高性能javascript学习总结(2)--DOM编程

    我们知道,对DOM的操作都是非常的耗性能的,那么为什么会耗性能呢?      文档对象模型(DOM)是一个独立于语言的,使用 XML和 HTML 文档操作的应用程序接口(API).在浏览器中,主要与 ...

  8. js原生函数一些封装

    这是一些js原生封装的函数,主要是为了兼容IE浏览器,如下 获取css样式 function getStyle(ele, prop) { if(window.getComputedStyle) { r ...

  9. 简单做出HTML5翻页效果文字特效

    之前在网上看到一款比较有新意的HTML5文字特效,文字效果是当鼠标滑过是出现翻开折叠的效果,类似书本翻页.于是我兴致勃勃的点开源码看了一下,发现其实实现也挺简单的,主要利用了CSS3的transfor ...

  10. 第三篇 css属性

    一.颜色属性 颜色属性有下面四种方式 <div style="color:blueviolet">ppppp</div> <div style=&qu ...