文件上传可能是一个比较耗时的操作,如果为上传操作带上进度提示则可以更好的提高用户体验,最后效果如下图:
项目源码:http://download.csdn.net/detail/shinay/4965230
这里只贴出代码,可根据实际情况自行修改。
-
packagecom.lxb.uploadwithprogress.http;
-
-
importjava.io.File;
-
-
importorg.apache.http.HttpResponse;
-
importorg.apache.http.client.HttpClient;
-
importorg.apache.http.client.methods.HttpPost;
-
importorg.apache.http.entity.mime.content.FileBody;
-
importorg.apache.http.impl.client.DefaultHttpClient;
-
importorg.apache.http.protocol.BasicHttpContext;
-
importorg.apache.http.protocol.HttpContext;
-
importorg.apache.http.util.EntityUtils;
-
-
importandroid.app.ProgressDialog;
-
importandroid.content.Context;
-
importandroid.os.AsyncTask;
-
-
importcom.lxb.uploadwithprogress.http.CustomMultipartEntity.ProgressListener;
-
-
publicclassHttpMultipartPostextendsAsyncTask<String,Integer,String>{
-
-
privateContextcontext;
-
privateStringfilePath;
-
privateProgressDialogpd;
-
privatelongtotalSize;
-
-
publicHttpMultipartPost(Contextcontext,StringfilePath){
-
this.context=context;
-
this.filePath=filePath;
-
}
-
-
@Override
-
protectedvoidonPreExecute(){
-
pd=newProgressDialog(context);
-
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
-
pd.setMessage("UploadingPicture...");
-
pd.setCancelable(false);
-
pd.show();
-
}
-
-
@Override
-
protectedStringdoInBackground(String...params){
-
StringserverResponse=null;
-
-
HttpClienthttpClient=newDefaultHttpClient();
-
HttpContexthttpContext=newBasicHttpContext();
-
HttpPosthttpPost=newHttpPost("上传URL,如:http://www.xx.com/upload.php");
-
-
try{
-
CustomMultipartEntitymultipartContent=newCustomMultipartEntity(
-
newProgressListener(){
-
@Override
-
publicvoidtransferred(longnum){
-
publishProgress((int)((num/(float)totalSize)*100));
-
}
-
});
-
-
-
multipartContent.addPart("data",newFileBody(newFile(
-
filePath)));
-
totalSize=multipartContent.getContentLength();
-
-
-
httpPost.setEntity(multipartContent);
-
HttpResponseresponse=httpClient.execute(httpPost,httpContext);
-
serverResponse=EntityUtils.toString(response.getEntity());
-
-
}catch(Exceptione){
-
e.printStackTrace();
-
}
-
-
returnserverResponse;
-
}
-
-
@Override
-
protectedvoidonProgressUpdate(Integer...progress){
-
pd.setProgress((int)(progress[0]));
-
}
-
-
@Override
-
protectedvoidonPostExecute(Stringresult){
-
System.out.println("result:"+result);
-
pd.dismiss();
-
}
-
-
@Override
-
protectedvoidonCancelled(){
-
System.out.println("cancle");
-
}
-
-
}
-
packagecom.lxb.uploadwithprogress.http;
-
-
importjava.io.FilterOutputStream;
-
importjava.io.IOException;
-
importjava.io.OutputStream;
-
importjava.nio.charset.Charset;
-
-
importorg.apache.http.entity.mime.HttpMultipartMode;
-
importorg.apache.http.entity.mime.MultipartEntity;
-
-
publicclassCustomMultipartEntityextendsMultipartEntity{
-
-
privatefinalProgressListenerlistener;
-
-
publicCustomMultipartEntity(finalProgressListenerlistener){
-
super();
-
this.listener=listener;
-
}
-
-
publicCustomMultipartEntity(finalHttpMultipartModemode,
-
finalProgressListenerlistener){
-
super(mode);
-
this.listener=listener;
-
}
-
-
publicCustomMultipartEntity(HttpMultipartModemode,finalStringboundary,
-
finalCharsetcharset,finalProgressListenerlistener){
-
super(mode,boundary,charset);
-
this.listener=listener;
-
}
-
-
@Override
-
publicvoidwriteTo(OutputStreamoutstream)throwsIOException{
-
super.writeTo(newCountingOutputStream(outstream,this.listener));
-
}
-
-
publicstaticinterfaceProgressListener{
-
voidtransferred(longnum);
-
}
-
-
publicstaticclassCountingOutputStreamextendsFilterOutputStream{
-
-
privatefinalProgressListenerlistener;
-
privatelongtransferred;
-
-
publicCountingOutputStream(finalOutputStreamout,
-
finalProgressListenerlistener){
-
super(out);
-
this.listener=listener;
-
this.transferred=0;
-
}
-
-
publicvoidwrite(byte[]b,intoff,intlen)throwsIOException{
-
out.write(b,off,len);
-
this.transferred+=len;
-
this.listener.transferred(this.transferred);
-
}
-
-
publicvoidwrite(intb)throwsIOException{
-
out.write(b);
-
this.transferred++;
-
this.listener.transferred(this.transferred);
-
}
-
}
-
-
}
上面为两个主要的类,下面放一个调用的Activity
-
packagecom.lxb.uploadwithprogress;
-
-
importjava.io.File;
-
-
importcom.lxb.uploadwithprogress.http.HttpMultipartPost;
-
-
importandroid.app.Activity;
-
importandroid.content.Context;
-
importandroid.os.Bundle;
-
importandroid.view.View;
-
importandroid.view.View.OnClickListener;
-
importandroid.widget.Button;
-
importandroid.widget.EditText;
-
importandroid.widget.Toast;
-
-
publicclassMainActivityextendsActivityimplementsOnClickListener{
-
-
privateContextcontext;
-
-
privateEditTextet_filepath;
-
privateButtonbtn_upload;
-
privateButtonbtn_cancle;
-
-
privateHttpMultipartPostpost;
-
-
@Override
-
protectedvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
-
context=this;
-
-
setContentView(R.layout.activity_main);
-
-
et_filepath=(EditText)findViewById(R.id.et_filepath);
-
btn_upload=(Button)findViewById(R.id.btn_upload);
-
btn_cancle=(Button)findViewById(R.id.btn_cancle);
-
-
btn_upload.setOnClickListener(this);
-
btn_cancle.setOnClickListener(this);
-
}
-
-
@Override
-
publicvoidonClick(Viewv){
-
switch(v.getId()){
-
caseR.id.btn_upload:
-
StringfilePath=et_filepath.getText().toString();
-
Filefile=newFile(filePath);
-
if(file.exists()){
-
post=newHttpMultipartPost(context,filePath);
-
post.execute();
-
}else{
-
Toast.makeText(context,"filenotexists",Toast.LENGTH_LONG).show();
-
}
-
break;
-
caseR.id.btn_cancle:
-
if(post!=null){
-
if(!post.isCancelled()){
-
post.cancel(true);
-
}
-
}
-
break;
-
}
-
-
}
-
-
}
当然,在Android中使用MultipartEntity类,必须为项目增加相应的jar包,httpmime-4.1.2.jar。
最后放上代码,工程里已包含jar。
地址:
http://download.csdn.net/detail/shinay/4965230
分享到:
相关推荐
android——SpringMVC实现批量文件上传 HTTP协议和HttpClient2种方式实现批量上传
《Android开发案例驱动教程》 配套代码。 注: 由于第12,13,14章代码太大,无法上传到一个包中。 这三节代码会放到其他压缩包中。 作者:关东升,赵志荣 Java或C++程序员转变成为Android程序员 采用案例驱动模式...
Android开发的测试网络连接质量的工具源码,分上传文件速度测试、下载文件速度测试和ping测试,有直观的界面查看测试过程,测试结果保存到文件。使用到了apache的HttpClient,和对ping命令的简单应用。
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 ...
支持大文件上传,上传大文件不会oom; 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT请求; 下载支持301/302重定向,支持设置是否根据Content-Disposition重命名下载的文件; 返回...
9.37、通过ANDROID 客户端上传数据到服务器 251 9.38、文件下载类 255 9.39、下载文件的进度条提示 263 9.40、通过HTTPCLIENT从指定SERVER获取数据 265 9.41、通过FTP传输文件,关闭UI获得返回码 266 9.42、激活...
9.37、通过ANDROID 客户端上传数据到服务器 251 9.38、文件下载类 255 9.39、下载文件的进度条提示 263 9.40、通过HTTPCLIENT从指定SERVER获取数据 265 9.41、通过FTP传输文件,关闭UI获得返回码 266 9.42、激活...
第一天 1>搭建Android开发环境 2> 创建与启动手机模拟器 3> 学习使用ANDROID操作系统 4> 开发与运行(卸载)第一个ANDROID应用 5> 项目的目录结构 6> 项目清单文件分析 7> 分析第一个ANDROID应用的启动过程 8> ...
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 ...
easy-okhttp是对OkHttp网络框架封装,提供文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。 OkHttp网络框架的流行始于Android,但是在Java后端仍然是Apache HttpClient网络框架,这...
|--文件之释放Assets下的文件到应用的File目录 |--文件之随机存储RandomAccessFile |--文件使用时间排序 |--文件复制粘贴 |--文件路径之通过uri获取 |--时间java常用应用 |--时间之handle记时器 |--时间之time的用法...
4> 网络--通过HTTP协议实现文件上传 第五天 1> 网络--通过HTTP协议发送XML数据,并调用webservice实现手机号归属地查询 2> 网络--通过HTTP协议实现多线程断点续传下载 3> 为应用添加新的Activity与参数传递 4> ...
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+源代码+文档说明+运行截图 - 运行中有什么问题可以私聊博主,本人高级安卓工程师,主页置顶有常见爆红解决的方法,以及更多代码项目 ## 项目备注 1、该资源内...
Andriod的Activity Intent 以及播放音乐,浏览信息,加入购物车,添加订单,通过HttpClient访问互联网资源,数据库完全放在web服务器上。
1.由Android Studio开发 2.使用了httpclient-4.3.5.jar、httpcore-4.3.2.jar、httpmime-4.3.5.jar 3.form表单多文件上传 4.本人测试通过。
这个网络请求库是基于Apache HttpClient库之上的一个异步网络请求处理库,网络处理均基于Android的非UI线程,通过回调方法(匿名内部类)处理请求结果。 2. 特征: (1).处理异步Http请求,并通过匿名内部类处理回调...
AsyncHttpHelp是一个android平台下基于httpclient开发的HTTP网络请求工具。 优点 功能齐全,提供常用的http网络访问接口。 轻量级,无任何第三方库依赖,库大小为90K左右。 定制化,自定义json解析库,支持请求...
此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...
Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...