Android(安卓)HttpClient post MultipartEntity - Android(安卓)上传文件
16lz
2021-12-04
转自[http://blog.csdn.net/hellohaifei/article/details/9707089]
在Android 中使用HttpClient,MultipartEntity
为了发送图片,文件等资源,现在采用开源的org.apache.http.entity.mime.MultipartEntity
一.去官网http://hc.apache.org/downloads.cgi下载
可以只下载binary,如果可能需要修改源文件的话,可以直接下载source.
二.导入jar包
将下载下来的httpcomponents-client-4.2.5-bin.zip取其httpcomponents-client-4.2.5-bin.zip\httpcomponents-client-4.2.5\lib\httpmime-4.2.5.jar包
将httpmime-4.2.5.jar包,放到android工程的lib目录下。
三. 查看jar包,
我这里用的是源文件,因为我需要修改些东西
三.使用
[java] view plain copy- classMyAsyncTaskextendsAsyncTask<String,Integer,String>{
- StringFORM_TABLE_NAME="ask?action=Chatbottom-toSay-";//自己需要配置的表单
- StringfilePath="/mnt/sdcard/picture.jpg";//测试写的文件路径,转换成自己的文件路径
- finalStringhostUrl="http://www.myhost.com";//写成自己要上传的地址
- @Override
- protectedStringdoInBackground(String...params){
- HttpClienthttpclient=null;
- httpclient=newDefaultHttpClient();
- finalHttpPosthttppost=newHttpPost(hostUrl);
- finalFileimageFile=newFile(filePath);
- finalMultipartEntitymultipartEntity=newMultipartEntity();
- if(false){
- InputStreamin=null;
- try{
- in=newFileInputStream(imageFile);
- }catch(FileNotFoundExceptione){
- e.printStackTrace();
- }
- InputStreamBodyinputStreamBody=newInputStreamBody(in,
- "android_inputstream.jpg");
- //FormBodyPartformBodyPart=newFormBodyPart(FORM_TABLE_NAME,
- //contentBody);
- multipartEntity.addPart(FORM_TABLE_NAME,inputStreamBody);
- }
- if(false){
- ContentBodycontentBody=newFileBody(imageFile);
- FormBodyPartformBodyPart=newFormBodyPart(FORM_TABLE_NAME,
- contentBody);
- multipartEntity.addPart(formBodyPart);
- }
- if(false){
- //FileBodyfileBody=newFileBody(imageFile,"image/jpeg",
- //"utf-8");
- FileBodyfileBody=newFileBody(imageFile);
- multipartEntity.addPart(FORM_TABLE_NAME,fileBody);
- }
- if(true){
- BitmapphotoBM=BitmapFactory.decodeFile(filePath);
- if(photoBM==null){
- returnnull;
- }
- ByteArrayOutputStreamphotoBao=newByteArrayOutputStream();
- booleansuccessCompress=photoBM.compress(CompressFormat.JPEG,
- 80,photoBao);
- if(!successCompress){
- returnnull;
- }
- ByteArrayBodybyteArrayBody=newByteArrayBody(
- photoBao.toByteArray(),"android.jpg");
- photoBM.recycle();
- //InputStreamBodyinbody=newInputStreamBody(newInputStream,
- //filename);
- multipartEntity.addPart(FORM_TABLE_NAME,byteArrayBody);
- }
- httppost.setEntity(multipartEntity);
- HttpResponsehttpResponse;
- try{
- httpResponse=httpclient.execute(httppost);
- finalintstatusCode=httpResponse.getStatusLine()
- .getStatusCode();
- Stringresponse=EntityUtils.toString(
- httpResponse.getEntity(),HTTP.UTF_8);
- IWLog.d("gotresponse:\n"+response);
- if(statusCode==HttpStatus.SC_OK){
- return"success";
- }
- }catch(ClientProtocolExceptione){
- e.printStackTrace();
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- if(httpclient!=null){
- httpclient.getConnectionManager().shutdown();
- httpclient=null;
- }
- }
- returnnull;
- }
- @Override
- protectedvoidonPostExecute(Stringresult){
- super.onPostExecute(result);
- if(result.equals("success")){
- }
- }
- }
四.与HttpURLConnection比较
网上好多人都用的是HttpURLConnection来上传图片,文件。由于我在解决实际问题时HttpURLConnection并不能达到预期,老是死在urlConnection.getInputStream()永远回不来。所以不得以改用的上面的库。最终感觉MultipartEntity用起来比较简单。
附:
在解决实际问题中,我也不是一帆风顺,也遇到了各种抽象的问题。推荐给大家个工具wireshark工具,用于抓取网络协议用的。很有帮助
更多0- 上一篇http Content-Type一览表
- 下一篇Android ImageView图片自适应
- 顶
更多相关文章
- NPM 和webpack 的基础使用
- 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
- Android4.2.2自增物理按键(frameworks)
- 编译 Android版本的Openal方式
- Android介绍
- 修改Android开机画面
- Android下载网络图片到本地
- android中将txt文件保存到SD卡中
- Android(安卓)SDK下载和更新失败的解决方法