`
阿尔萨斯
  • 浏览: 4187334 次
社区版块
存档分类
最新评论

Android开发之httpclient文件上传实现

 
阅读更多

文件上传可能是一个比较耗时的操作,如果为上传操作带上进度提示则可以更好的提高用户体验,最后效果如下图:




项目源码:http://download.csdn.net/detail/shinay/4965230



这里只贴出代码,可根据实际情况自行修改。


  1. packagecom.lxb.uploadwithprogress.http;
  2. importjava.io.File;
  3. importorg.apache.http.HttpResponse;
  4. importorg.apache.http.client.HttpClient;
  5. importorg.apache.http.client.methods.HttpPost;
  6. importorg.apache.http.entity.mime.content.FileBody;
  7. importorg.apache.http.impl.client.DefaultHttpClient;
  8. importorg.apache.http.protocol.BasicHttpContext;
  9. importorg.apache.http.protocol.HttpContext;
  10. importorg.apache.http.util.EntityUtils;
  11. importandroid.app.ProgressDialog;
  12. importandroid.content.Context;
  13. importandroid.os.AsyncTask;
  14. importcom.lxb.uploadwithprogress.http.CustomMultipartEntity.ProgressListener;
  15. publicclassHttpMultipartPostextendsAsyncTask<String,Integer,String>{
  16. privateContextcontext;
  17. privateStringfilePath;
  18. privateProgressDialogpd;
  19. privatelongtotalSize;
  20. publicHttpMultipartPost(Contextcontext,StringfilePath){
  21. this.context=context;
  22. this.filePath=filePath;
  23. }
  24. @Override
  25. protectedvoidonPreExecute(){
  26. pd=newProgressDialog(context);
  27. pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  28. pd.setMessage("UploadingPicture...");
  29. pd.setCancelable(false);
  30. pd.show();
  31. }
  32. @Override
  33. protectedStringdoInBackground(String...params){
  34. StringserverResponse=null;
  35. HttpClienthttpClient=newDefaultHttpClient();
  36. HttpContexthttpContext=newBasicHttpContext();
  37. HttpPosthttpPost=newHttpPost("上传URL,如:http://www.xx.com/upload.php");
  38. try{
  39. CustomMultipartEntitymultipartContent=newCustomMultipartEntity(
  40. newProgressListener(){
  41. @Override
  42. publicvoidtransferred(longnum){
  43. publishProgress((int)((num/(float)totalSize)*100));
  44. }
  45. });
  46. //WeuseFileBodytotransferanimage
  47. multipartContent.addPart("data",newFileBody(newFile(
  48. filePath)));
  49. totalSize=multipartContent.getContentLength();
  50. //Sendit
  51. httpPost.setEntity(multipartContent);
  52. HttpResponseresponse=httpClient.execute(httpPost,httpContext);
  53. serverResponse=EntityUtils.toString(response.getEntity());
  54. }catch(Exceptione){
  55. e.printStackTrace();
  56. }
  57. returnserverResponse;
  58. }
  59. @Override
  60. protectedvoidonProgressUpdate(Integer...progress){
  61. pd.setProgress((int)(progress[0]));
  62. }
  63. @Override
  64. protectedvoidonPostExecute(Stringresult){
  65. System.out.println("result:"+result);
  66. pd.dismiss();
  67. }
  68. @Override
  69. protectedvoidonCancelled(){
  70. System.out.println("cancle");
  71. }
  72. }

  1. packagecom.lxb.uploadwithprogress.http;
  2. importjava.io.FilterOutputStream;
  3. importjava.io.IOException;
  4. importjava.io.OutputStream;
  5. importjava.nio.charset.Charset;
  6. importorg.apache.http.entity.mime.HttpMultipartMode;
  7. importorg.apache.http.entity.mime.MultipartEntity;
  8. publicclassCustomMultipartEntityextendsMultipartEntity{
  9. privatefinalProgressListenerlistener;
  10. publicCustomMultipartEntity(finalProgressListenerlistener){
  11. super();
  12. this.listener=listener;
  13. }
  14. publicCustomMultipartEntity(finalHttpMultipartModemode,
  15. finalProgressListenerlistener){
  16. super(mode);
  17. this.listener=listener;
  18. }
  19. publicCustomMultipartEntity(HttpMultipartModemode,finalStringboundary,
  20. finalCharsetcharset,finalProgressListenerlistener){
  21. super(mode,boundary,charset);
  22. this.listener=listener;
  23. }
  24. @Override
  25. publicvoidwriteTo(OutputStreamoutstream)throwsIOException{
  26. super.writeTo(newCountingOutputStream(outstream,this.listener));
  27. }
  28. publicstaticinterfaceProgressListener{
  29. voidtransferred(longnum);
  30. }
  31. publicstaticclassCountingOutputStreamextendsFilterOutputStream{
  32. privatefinalProgressListenerlistener;
  33. privatelongtransferred;
  34. publicCountingOutputStream(finalOutputStreamout,
  35. finalProgressListenerlistener){
  36. super(out);
  37. this.listener=listener;
  38. this.transferred=0;
  39. }
  40. publicvoidwrite(byte[]b,intoff,intlen)throwsIOException{
  41. out.write(b,off,len);
  42. this.transferred+=len;
  43. this.listener.transferred(this.transferred);
  44. }
  45. publicvoidwrite(intb)throwsIOException{
  46. out.write(b);
  47. this.transferred++;
  48. this.listener.transferred(this.transferred);
  49. }
  50. }
  51. }

上面为两个主要的类,下面放一个调用的Activity

  1. packagecom.lxb.uploadwithprogress;
  2. importjava.io.File;
  3. importcom.lxb.uploadwithprogress.http.HttpMultipartPost;
  4. importandroid.app.Activity;
  5. importandroid.content.Context;
  6. importandroid.os.Bundle;
  7. importandroid.view.View;
  8. importandroid.view.View.OnClickListener;
  9. importandroid.widget.Button;
  10. importandroid.widget.EditText;
  11. importandroid.widget.Toast;
  12. publicclassMainActivityextendsActivityimplementsOnClickListener{
  13. privateContextcontext;
  14. privateEditTextet_filepath;
  15. privateButtonbtn_upload;
  16. privateButtonbtn_cancle;
  17. privateHttpMultipartPostpost;
  18. @Override
  19. protectedvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. context=this;
  22. setContentView(R.layout.activity_main);
  23. et_filepath=(EditText)findViewById(R.id.et_filepath);
  24. btn_upload=(Button)findViewById(R.id.btn_upload);
  25. btn_cancle=(Button)findViewById(R.id.btn_cancle);
  26. btn_upload.setOnClickListener(this);
  27. btn_cancle.setOnClickListener(this);
  28. }
  29. @Override
  30. publicvoidonClick(Viewv){
  31. switch(v.getId()){
  32. caseR.id.btn_upload:
  33. StringfilePath=et_filepath.getText().toString();
  34. Filefile=newFile(filePath);
  35. if(file.exists()){
  36. post=newHttpMultipartPost(context,filePath);
  37. post.execute();
  38. }else{
  39. Toast.makeText(context,"filenotexists",Toast.LENGTH_LONG).show();
  40. }
  41. break;
  42. caseR.id.btn_cancle:
  43. if(post!=null){
  44. if(!post.isCancelled()){
  45. post.cancel(true);
  46. }
  47. }
  48. break;
  49. }
  50. }
  51. }

当然,在Android中使用MultipartEntity类,必须为项目增加相应的jar包,httpmime-4.1.2.jar。


最后放上代码,工程里已包含jar。

地址:

http://download.csdn.net/detail/shinay/4965230

分享到:
评论

相关推荐

    android批量文件上传(附服务端Demo)

    android——SpringMVC实现批量文件上传 HTTP协议和HttpClient2种方式实现批量上传

    Android开发案例驱动教程 配套代码

    《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...

    Android开发的wifi网络测试小工具

    Android开发的测试网络连接质量的工具源码,分上传文件速度测试、下载文件速度测试和ping测试,有直观的界面查看测试过程,测试结果保存到文件。使用到了apache的HttpClient,和对ping命令的简单应用。

    Android典型技术模块开发详解

    11.3.4 文件上传 11.4 HttpClient 11.4.1 HttpGet请求 11.4.2 HttpPost请求 11.5 本章小结 第12章 数据解析 12.1 XML 12.1.1 DOM 12.1.2 SAX 12.1.3 PULL 12.2 JSON格式 12.2.1 基本类型 12.2.2 数组和集合 12.2.3 ...

    Android 常用六大框架

    支持大文件上传,上传大文件不会oom; 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; 返回...

    Android开发资料合集-World版!

    9.37、通过ANDROID 客户端上传数据到服务器 251 9.38、文件下载类 255 9.39、下载文件的进度条提示 263 9.40、通过HTTPCLIENT从指定SERVER获取数据 265 9.41、通过FTP传输文件,关闭UI获得返回码 266 9.42、激活...

    Android 开发技巧

    9.37、通过ANDROID 客户端上传数据到服务器 251 9.38、文件下载类 255 9.39、下载文件的进度条提示 263 9.40、通过HTTPCLIENT从指定SERVER获取数据 265 9.41、通过FTP传输文件,关闭UI获得返回码 266 9.42、激活...

    黎活明android教程的全程PPT

    第一天 1&gt;搭建Android开发环境 2&gt; 创建与启动手机模拟器 3&gt; 学习使用ANDROID操作系统 4&gt; 开发与运行(卸载)第一个ANDROID应用 5&gt; 项目的目录结构 6&gt; 项目清单文件分析 7&gt; 分析第一个ANDROID应用的启动过程 8&gt; ...

    精通ANDROID 3(中文版)1/2

    1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 Android UI  1.5.3 Android基础组件  1.5.4 高级UI概念  1.5.5 Android Service组件  1.5.6 Android媒体和电话组件  1.5.7 ...

    基于对okhttp3封装后Java网络框架,提供了更为便捷的方法调用 目的是为了替换难用的Apache HttpClient

    easy-okhttp是对OkHttp网络框架封装,提供文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。 OkHttp网络框架的流行始于Android,但是在Java后端仍然是Apache HttpClient网络框架,这...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--文件之释放Assets下的文件到应用的File目录 |--文件之随机存储RandomAccessFile |--文件使用时间排序 |--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法...

    传智播客Android视频教程-课程源码.rar

    4&gt; 网络--通过HTTP协议实现文件上传 第五天 1&gt; 网络--通过HTTP协议发送XML数据,并调用webservice实现手机号归属地查询 2&gt; 网络--通过HTTP协议实现多线程断点续传下载 3&gt; 为应用添加新的Activity与参数传递 4&gt; ...

    精通Android 3 (中文版)2/2

    1.5 使用Android SDK开发最终用户应用程序  1.5.1 Android模拟器  1.5.2 Android UI  1.5.3 Android基础组件  1.5.4 高级UI概念  1.5.5 Android Service组件  1.5.6 Android媒体和电话组件  1.5.7 ...

    安卓移动开发课程设计/Android期末大作业-教务系统app+源代码+文档说明+运行截图

    安卓移动开发课程设计/Android期末大作业-教务系统app+源代码+文档说明+运行截图 - 运行中有什么问题可以私聊博主,本人高级安卓工程师,主页置顶有常见爆红解决的方法,以及更多代码项目 ## 项目备注 1、该资源内...

    手机订餐系统(Android访问互联网资源)

    Andriod的Activity Intent 以及播放音乐,浏览信息,加入购物车,添加订单,通过HttpClient访问互联网资源,数据库完全放在web服务器上。

    android.form.upload

    1.由Android Studio开发 2.使用了httpclient-4.3.5.jar、httpcore-4.3.2.jar、httpmime-4.3.5.jar 3.form表单多文件上传 4.本人测试通过。

    Android网络请求库android-async-http介绍

    这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果。 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调...

    Android平台下轻量级http网络传输库

    AsyncHttpHelp是一个android平台下基于httpclient开发的HTTP网络请求工具。 优点 功能齐全,提供常用的http网络访问接口。 轻量级,无任何第三方库依赖,库大小为90K左右。 定制化,自定义json解析库,支持请求...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    java开源包3

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

Global site tag (gtag.js) - Google Analytics