Android使用HttpClient向服务器传输文件
HttpClient是Apache Jakarta Common下的子项目,可以用来提供功能丰富的支持HTTP协议的客户端编程工具包,这几天写客户端的时候遇到个问题,“客户端需要向服务器发送Post请求的时候要同时附带请求参数和文件”,刚接触HttpClient,不太了解,尝试了好久终于找到了方法,故写个随笔记一下。
问题:
客户端向服务器发送post请求的时候要同时带参数和文件
开发环境:
Android Studio1.22
HttpClient版本:httpclient-android 4.3.5.1
1、build.gradle中添加依赖:
1 dependencies { 2 compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' 3 compile 'org.apache.httpcomponents:httpmime:4.3.6' 4 }
注意:添加依赖包后编译会报一个重定义的错误,我把jar包下载下来看了一下,似乎是这个项目由maven构建的,httpclient和httpmime里面pom.xml的依赖有重复的,而且META-INF文件夹下面有很多重复的文件(具体的还是不太清楚,这些仅是自己的理解,不知道是否正确,大家仅供参考),在build.gradle中添加如下代码就可以解决了:
1 android{ 2 packagingOptions { 3 exclude 'META-INF/DEPENDENCIES' 4 exclude 'META-INF/NOTICE' 5 exclude 'META-INF/LICENSE' 6 exclude 'META-INF/LICENSE.txt' 7 exclude 'META-INF/NOTICE.txt' 8 } 9 10 }
2、AndroidManifest.xml中添加相应的网络权限和文件读写权限
1 <uses-permission android:name="android.permission.INTERNET"/> 2 <!-- SDCard中创建与删除文件权限 --> 3 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 4 <!-- 向SDCard写入数据权限 --> 5 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 6 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
3、上传文件:
1 CloseableHttpClient httpClient = HttpClients.createDefault(); 2 HttpPostHC4 httpPostHC4 = new HttpPostHC4(url); 3 File file = new File(filePath); 4 if(file == null){ 5 throw new Exception(filePath+"指定的文件不存在"); 6 } 7 HttpEntity multipartEntity = MultipartEntityBuilder.create() 8 .addPart("param1", new StringBody("param1Str")) 9 .addPart("param2",new StringBody("param2Str")) 10 .addPart("file", new FileBody(file)).build(); 11 httpPostHC4.setEntity(multipartEntity); 12 CloseableHttpResponse response = httpClient.execute(httpPostHC4);
其实主要是MultipartEntity的使用