Android开发之httpclient文件上传实现

基于MVP模式,设计自己的RxJava+Retrofit2+Okhttp3+Rxlifecycle开发框架 在开发阶段,如果有一个好的开发框架,不仅能提高开发效率,更能减少后期维护的时间。结合自己的实际,封装了一套MVP+RxJava+Retrofit2+Okhttp3+Rxlifecycle+Butterknife的开发框架。架构层:V层只负责视图的操作,P层只负责数据的交互,M层负责逻辑的处理,应该属于完整意义上的MVP代码结构模式。网络层包括:普通的get/post请求,文件上传、文件带进度下载,... 阅读详情

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




项目源码:http://download.youkuaiyun.com/detail/shinay/4965230



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


[java]  view plain copy
  1. package com.lxb.uploadwithprogress.http;  
  2.   
  3. import java.io.File;  
  4.   
  5. import org.apache.http.HttpResponse;  
  6. import org.apache.http.client.HttpClient;  
  7. import org.apache.http.client.methods.HttpPost;  
  8. import org.apache.http.entity.mime.content.FileBody;  
  9. import org.apache.http.impl.client.DefaultHttpClient;  
  10. import org.apache.http.protocol.BasicHttpContext;  
  11. import org.apache.http.protocol.HttpContext;  
  12. import org.apache.http.util.EntityUtils;  
  13.   
  14. import android.app.ProgressDialog;  
  15. import android.content.Context;  
  16. import android.os.AsyncTask;  
  17.   
  18. import com.lxb.uploadwithprogress.http.CustomMultipartEntity.ProgressListener;  
  19.   
  20. public class HttpMultipartPost extends AsyncTask<String, Integer, String> {  
  21.   
  22.     private Context context;  
  23.     private String filePath;  
  24.     private ProgressDialog pd;  
  25.     private long totalSize;  
  26.   
  27.     public HttpMultipartPost(Context context, String filePath) {  
  28.         this.context = context;  
  29.         this.filePath = filePath;  
  30.     }  
  31.   
  32.     @Override  
  33.     protected void onPreExecute() {  
  34.         pd = new ProgressDialog(context);  
  35.         pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  36.         pd.setMessage("Uploading Picture...");  
  37.         pd.setCancelable(false);  
  38.         pd.show();  
  39.     }  
  40.   
  41.     @Override  
  42.     protected String doInBackground(String... params) {  
  43.         String serverResponse = null;  
  44.   
  45.         HttpClient httpClient = new DefaultHttpClient();  
  46.         HttpContext httpContext = new BasicHttpContext();  
  47.         HttpPost httpPost = new HttpPost("上传URL, 如:http://www.xx.com/upload.php");  
  48.   
  49.         try {  
  50.             CustomMultipartEntity multipartContent = new CustomMultipartEntity(  
  51.                     new ProgressListener() {  
  52.                         @Override  
  53.                         public void transferred(long num) {  
  54.                             publishProgress((int) ((num / (float) totalSize) * 100));  
  55.                         }  
  56.                     });  
  57.   
  58.             // We use FileBody to transfer an image  
  59.             multipartContent.addPart("data", new FileBody(new File(  
  60.                     filePath)));  
  61.             totalSize = multipartContent.getContentLength();  
  62.   
  63.             // Send it  
  64.             httpPost.setEntity(multipartContent);  
  65.             HttpResponse response = httpClient.execute(httpPost, httpContext);  
  66.             serverResponse = EntityUtils.toString(response.getEntity());  
  67.               
  68.         } catch (Exception e) {  
  69.             e.printStackTrace();  
  70.         }  
  71.   
  72.         return serverResponse;  
  73.     }  
  74.   
  75.     @Override  
  76.     protected void onProgressUpdate(Integer... progress) {  
  77.         pd.setProgress((int) (progress[0]));  
  78.     }  
  79.   
  80.     @Override  
  81.     protected void onPostExecute(String result) {  
  82.         System.out.println("result: " + result);  
  83.         pd.dismiss();  
  84.     }  
  85.   
  86.     @Override  
  87.     protected void onCancelled() {  
  88.         System.out.println("cancle");  
  89.     }  
  90.   
  91. }  

[java]  view plain copy
  1. package com.lxb.uploadwithprogress.http;  
  2.   
  3. import java.io.FilterOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.OutputStream;  
  6. import java.nio.charset.Charset;  
  7.   
  8. import org.apache.http.entity.mime.HttpMultipartMode;  
  9. import org.apache.http.entity.mime.MultipartEntity;  
  10.   
  11. public class CustomMultipartEntity extends MultipartEntity {  
  12.   
  13.     private final ProgressListener listener;  
  14.   
  15.     public CustomMultipartEntity(final ProgressListener listener) {  
  16.         super();  
  17.         this.listener = listener;  
  18.     }  
  19.   
  20.     public CustomMultipartEntity(final HttpMultipartMode mode,  
  21.             final ProgressListener listener) {  
  22.         super(mode);  
  23.         this.listener = listener;  
  24.     }  
  25.   
  26.     public CustomMultipartEntity(HttpMultipartMode mode, final String boundary,  
  27.             final Charset charset, final ProgressListener listener) {  
  28.         super(mode, boundary, charset);  
  29.         this.listener = listener;  
  30.     }  
  31.   
  32.     @Override  
  33.     public void writeTo(OutputStream outstream) throws IOException {  
  34.         super.writeTo(new CountingOutputStream(outstream, this.listener));  
  35.     }  
  36.   
  37.     public static interface ProgressListener {  
  38.         void transferred(long num);  
  39.     }  
  40.   
  41.     public static class CountingOutputStream extends FilterOutputStream {  
  42.           
  43.         private final ProgressListener listener;  
  44.         private long transferred;  
  45.   
  46.         public CountingOutputStream(final OutputStream out,  
  47.                 final ProgressListener listener) {  
  48.             super(out);  
  49.             this.listener = listener;  
  50.             this.transferred = 0;  
  51.         }  
  52.   
  53.         public void write(byte[] b, int off, int len) throws IOException {  
  54.             out.write(b, off, len);  
  55.             this.transferred += len;  
  56.             this.listener.transferred(this.transferred);  
  57.         }  
  58.   
  59.         public void write(int b) throws IOException {  
  60.             out.write(b);  
  61.             this.transferred++;  
  62.             this.listener.transferred(this.transferred);  
  63.         }  
  64.     }  
  65.   
  66. }  

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

[java]  view plain copy
  1. package com.lxb.uploadwithprogress;  
  2.   
  3. import java.io.File;  
  4.   
  5. import com.lxb.uploadwithprogress.http.HttpMultipartPost;  
  6.   
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.EditText;  
  14. import android.widget.Toast;  
  15.   
  16. public class MainActivity extends Activity implements OnClickListener {  
  17.       
  18.     private Context context;  
  19.       
  20.     private EditText et_filepath;  
  21.     private Button btn_upload;  
  22.     private Button btn_cancle;  
  23.       
  24.     private HttpMultipartPost post;  
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.           
  30.         context = this;  
  31.           
  32.         setContentView(R.layout.activity_main);  
  33.           
  34.         et_filepath = (EditText) findViewById(R.id.et_filepath);  
  35.         btn_upload = (Button) findViewById(R.id.btn_upload);  
  36.         btn_cancle = (Button) findViewById(R.id.btn_cancle);  
  37.        
  38.         btn_upload.setOnClickListener(this);  
  39.         btn_cancle.setOnClickListener(this);  
  40.     }  
  41.   
  42.     @Override  
  43.     public void onClick(View v) {  
  44.         switch (v.getId()) {  
  45.         case R.id.btn_upload:  
  46.             String filePath = et_filepath.getText().toString();  
  47.             File file = new File(filePath);  
  48.             if (file.exists()) {  
  49.                 post = new HttpMultipartPost(context, filePath);  
  50.                 post.execute();  
  51.             } else {  
  52.                 Toast.makeText(context, "file not exists", Toast.LENGTH_LONG).show();  
  53.             }  
  54.             break;  
  55.         case R.id.btn_cancle:  
  56.             if (post != null) {  
  57.                 if (!post.isCancelled()) {  
  58.                     post.cancel(true);  
  59.                 }  
  60.             }  
  61.             break;  
  62.         }  
  63.           
  64.     }  
  65.       
  66. }  

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


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

地址:

http://download.youkuaiyun.com/detail/shinay/4965230

Android平台的文件上传实现详解 本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Android平台上实现上传功能的方法,包括通过HTTP/HTTPS协议上传数据到服务器的基本原理。通过实例代码演示了使用HttpURLConnection和OkHttp进行文件上传的过程,并讨论了处理文件元数据、异步任务执行、以及使用Retrofit等现代网络库的方法。文章还涵盖了异常处理、上传进度跟踪和上传安全性等... 阅读详情

相关推荐

httpClient 3.1 JAR库文件(可导入eclipse)

Apache推出的httpClient 3.1 导入Eclipse方法: 1.解压zip,找出3个jar文件,放入一个你想放的文件夹中 2.右键Eclipse中的工程,选择Build Path->Configure Build Path 3.选择Add External Jar,选择解压得到的3个jar即可

导入HttpClient类库

右键Module - Open Module Settings - Dependencies, 找到"+"按钮,选择Library dependency,弹出对话框, 输入org.apache.http.client 点击搜索,确认加入即可

Act 6087

android httpclient文件上传 http协议post get方法向服务器传输数据

小小测试项目包含了4个知识点,其中包含了http协议向服务器传输数据的post和get方法,包含了httpclient传输方法,httpclient上传文件到服务器的方法,

HttpClient入门

HttpClient入门作者:金发华,陈樟洪    文章来源:IBM developerWorks    点击数:593    更新时间:2005-11-25HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然

4万+

PyCharm启动报错急救指南:3步定位.vmoptions文件位置(Win/Mac路径详解)

本文针对PyCharm启动失败问题,提供了一份详细的急救指南。核心在于精准定位并修复关键的.vmoptions配置文件。文章通过三步法详解了在Windows和macOS系统上查找该文件的具体路径,并分析了因新旧版本冲突、破解补丁残留或参数设置错误导致启动失败的常见场景及解决办法,帮助开发者快速恢复IDE的正常工作。

weixin_28835789的博客 702

Habitat安装全网最详细教程,手把手带你跑通example.py(全网唯一)

全网最详细具身智能仿真平台habitat的安装教程

shannanshouyin的博客 2757

【Android基础知识】使用Http和HttpClient上传文件

分别使用Http方式和HttpClient方式向服务器上传图片 服务器端 建立UploadServlet.java 文件,接收上传的文件数据,指定在服务器端存储的位置。 /** * * @author meng.li * 指定文件的存储位置为E盘 */ @MultipartConfig( location ="E:\\" ) public class UploadServlet

自由世界的专栏 3520

单细胞分析实战:当Seurat的SCTransform遇上Harmony,我的整合流程优化笔记

本文详细介绍了单细胞转录组数据分析中SCTransform与Harmony整合流程的优化策略。通过实战案例展示如何调整SCTransform参数、优化Harmony整合效果,并解决常见问题,帮助研究者获得更可靠的生物学发现。特别适合需要处理批次效应的单细胞数据分析人员。

weixin_42552716的博客 359

java爬虫(一) - HttpClient

爬虫入门网络爬虫简介为什么要学习爬虫下面演示httpClient方式普通 get 方式带参 get 方式普通 post 方式带参 post 方式创建连接池管理httpClient 网络爬虫简介 网络爬虫也叫网络机器人, 是一种可以按照一定规则自动采集互联网信息的程序或脚本, 爬虫一般分为数据采集, 处理, 储存三个部分, 从若干初始网页的URL开始抓取网页, 不断获取页面上的URL放入队列直到满足系统的一定条件停止 为什么要学习爬虫 可以实现私人的搜索引擎 大数据时代获取数据源, 作数据分析 可

qq_45752401的博客 1394

FPGA电路设计1——芯片原理图和封装制作流程

本文详细介绍了FPGA电路板设计的学习过程,以Xilinx Kintex-7系列FPGA为例。主要内容包括:1)从官网下载芯片引脚分配文件的方法;2)原理图库绘制流程,重点讲解Bank划分(配置Bank、HR/HP IO Bank、高速收发器Bank)及利用Excel预处理数据;3)使用Altium Designer的Symbol Wizard工具实现引脚自动化导入;4)原理图设计要点,包括电源系统设计(多电压需求与上电时序)、配置电路(JTAG/Flash接口)和时钟设计。

在读研究生,FPGA电路设计与功能开发。 1385

【git】git: ‘interpret-trailers’ is not a git command. See ‘git --help’

cents 7.6系统. yum源安装git最新版本是1.8.3 报错: git: 'interpret-trailers' is not a git command. See 'git --help'. cannot insert change-id line in .git/COMMIT_EDITMSG 解决: git add xxx git commit -m "xxx" 然后修改 vim .git/hooks/commit-msg #if test -n "${reviewurl}" ; th

machh的专栏 4758

ANDROID批量文件上传(附Demo文件)

前言 此篇主要介绍android的批量文件上传(从相册选择图片并上传)。 客户端采用HttpClient和Http协议共2种上传方式。 服务端采用Spring MVC接收批量文件上传。 ANDROID客户端 1、HttpClient方式上传 准备文件 httpmime-4.1.1.jar (源码里面libs文件夹下) 代码中需要使用到此jar文件中的MultipartEntity

Javen天道酬勤 7121

1.4 KFD 设备文件的获取与驱动握手协议

本文分析了OpenClose模块中libhsakmt与KFD内核驱动建立通信的过程。首先通过hsaKmtOpenKFD()函数打开/dev/kfd设备文件,建立用户态与内核态的通信通道。随后通过AMDKFD_IOC_GET_VERSION ioctl命令完成版本握手,确认双方的接口兼容性。KFD驱动采用Major.Minor二级版本号体系,当前主要版本为1,从1.1演进到1.19不断添加新功能。整个过程构成了用户态与内核态之间的"建连协议",是所有后续GPU操作的基础前提。

图形/计算GPU的驱动与虚拟化技术分享园地 608

java android 服务器_java攻城狮之路(Android篇)--与服务器交互

一、图片查看器和网页源码查看器在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面练习1(图片查看器):packagecom.shellway.imagelooker;importjava.io.IOException;importjava.io.InputStream;importjava.net.HttpU...

weixin_33982195的博客 209

机器人控制基础:伺服驱动器的泄放电阻

摘要:伺服驱动器泄放电阻用于消耗电机减速或制动时产生的再生电能,防止母线电压过高损坏元件。其核心作用是将多余电能转化为热能,规避硬件损坏和停机风险。选型需关注功率、阻值和封装三大参数,功率应匹配再生能量,阻值需符合驱动器要求,封装应满足散热需求。可通过动态监测母线电压或静态检测电阻阻值来判断其是否正常工作。

start_up_go的博客 381

【全球人口数据集】全球人口密度数据集GPWv4

全球人口密度数据集GPWv4

WW、forever的博客 1003

Android 发送HTTP GET POST 请求以及通过 MultipartEntityBuilder 上传文件

为什么80%的码农都做不了架构师?>>> ...

weixin_34303897的博客 208

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android网络编程基础(二)

1 post方式提交数据乱码的解决Android端的默认编码是utf-8; 一般在公司开发客户端和服务端的编码要保持一致。 做url请求时需要对参数进行URLEncode编码. URL url = new URL("http:// 169.254.248.190:8080/jokerjohn/servlet/LoginServlet?username="+URLEncoder.encode(user

Catalina 481

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

java攻城狮之路(Android篇)--与服务器交互

一、图片查看器和网页源码查看器 在输入地址的是不能输入127.0.0.1 或者是 localhost.ScrollView :可以看成一个滚轴 可以去包裹很多的控件在里面 练习1(图片查看器): package com.shellway.imagelooker; import java.io.IOException; import java.io.InputStream...

weixin_34186128的博客 136

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android中Http网络请求库Asnyc-http的使用第三方库

Volley框架: 特点: 通信更快,更简单Get,Post网络请求及网络图像的高效率异步处理请求。当多个请求时,对网络请求进行排序,按优先级处理当网络状况不好时,Volley可以自动对上次请求的数据进行缓存。当有多个请求同时进行时,可以将这些请求同时取消。和Activity生命周期联动,当Activity销毁时,可以同时取消网络请求操作。 缺点:  不适合数据的上传和下载,不

小傅同志的专栏 1953

Android文件上传,PHP端接收

最近项目中要用优化文件上传操作,因此对Android端文件上传做下总结。测试服务器端就用PHP写了,比较简单,代码如下: [php]view plaincopy <?php $base_path="./uploads/";//接收文件目录 $target_path=$base_path.basename($_FILES...

weixin_30825581的博客 130

利用HttpClient实现文件上传

除了文件下载外,文件上传也是项目开发中经常用到的功能。此时需要用HttpClient类库的扩展包HttpMime中的MultipartEntity类,此类同样实现了HttpEntity接口。需要注意的是HttpClient通过POST来上传文件,而不是通过流的形式。 示例:使用HttpClient实现文件上传功能。 第一步:要求在服务器端使用fileupload组件接收客户端提交内容。新建一个JS...

哈 3702

Android开发之网络请求通信专题(二):基于HttpClient的文件上传下载

上一篇专题Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信我们讲解了如何使用httpurlconnection来实现基本的文本数据传输。一般在实际开发中我们可以用于传输xml或者json格式的数据。今天我们来讲解另外一种http网络请求的方式:httpclient,并实现文件的上传和下载。 在这里插个题外话,其实这些网络请求有很多第三方jar包可以使用

victorfreedom的专栏 3959

安卓使用HttpClient进行Http Post文件上传

项目有个需求就是需要上传文件,由于传文件要用到multipart/data-form这种content-type。 里面内容全是2进制,各个field需要自己去拼。今天上午用java的HttpUrlConnection那个类自己去做,结果一上午都没做出来,服务器一直报错,拿浏览器提交就一点问题也没有。对比浏览器的报文,眼睛都看花了也没觉得哪里不一样。于是下午就开始尝试HttpClient。 在

小龙同学的博客 1188
上一篇: Android开发之ListView条目批量选择删除
下一篇: Android开发之http协议解析
minimicall
博客等级 码龄18年 407粉丝 174原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值