博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android使用HttpClient实现文件上传到PHP服务器,并监控进度条
阅读量:7099 次
发布时间:2019-06-28

本文共 4815 字,大约阅读时间需要 16 分钟。

上传

端PHP

代码如下 :

监控进度实现

首先定义监听器接口,如下所示:

//进度监听器接口public interface ProgressListener {
public void transferred(long transferedBytes);}

实现进度的关键部分就在于记录已传输字节数,所以我们需重载FilterOutputStream,重写其中的关键方法,实现进度监听的功能,如下所示,本例中首先重载的是HttpEntityWrapper,顾名思义,就是将需发送的HttpEntity打包,以便计算总字节数,代码如下:

// ProgressOutHttpEntity:输出流(OutputStream)时记录已发送字节数public class ProgressOutHttpEntity extends HttpEntityWrer {
private final ProgressListener listener; public ProgressOutHttpEntity(final HttpEntity entity, final ProgressListener listener) {
super(entity); this.listener = listener; } public static class CountingOutputStream extends FilterOutputStream {
private final ProgressListener listener; private transferred; CountingOutputStream(final OutputStream out, final ProgressListener listener) {
super(out); this.listener = listener; this.transferred = 0; } @Override public void write(final byte[] b, final int off, final int len) throws IOException {
// NO, double-counting, as super.write(byte[], int, int) // delegates to write(int). // super.write(b, off, len); out.write(b, off, len); this.transferred += len; this.listener.transferred(this.transferred); } @Override public void write(final int b) throws IOException {
out.write(b); this.transferred++; this.listener.transferred(this.transferred); } } @Override public void writeTo(final OutputStream out) throws IOException {
this.wredEntity.writeTo(out instanceof CountingOutputStream ? out : new CountingOutputStream(out, this.listener)); }}

最后就是使用上述实现的类和Httpclient进行上传并显示进度的功能,非常简单,代码如下,使用AsyncTask异步上传。

public class FileUploadAsyncTask extends AsyncTask
{
private String url = "http://192.168.83.213/receive_file.php"; private Context context; private ProgressDialog pd; private totalSize; public FileUploadAsyncTask(Context context) {
this.context = context; } @Override protected void onPreExecute() {
pd = new ProgressDialog(context); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setMessage("上传中...."); pd.setCancelable(false); pd.show(); } @Override protected String doInBackground(File... params) {
// 保存需上传文件信息 MultipartEntityBuilder entitys = MultipartEntityBuilder.create(); entitys.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); entitys.setCharset(Charset.forName(HTTP.UTF_8)); File file = params[0]; entitys.addPart("file", new FileBody(file)); HttpEntity httpEntity = entitys.build(); totalSize = httpEntity.getContentLength(); ProgressOutHttpEntity progressHttpEntity = new ProgressOutHttpEntity( httpEntity, new ProgressListener() {
@Override public void transferred( transferedBytes) {
publishProgress((int) (100 * transferedBytes / totalSize)); } }); return uploadFile(url, progressHttpEntity); } @Override protected void onProgressUpdate(Integer... progress) {
pd.setProgress((int) (progress[0])); } @Override protected void onPostExecute(String result) {
pd.dismiss(); Toast.makeText(context, result, Toast.LENGTH_SHORT).show(); } //上传文件到 //地址 //文件 public static String uploadFile(String url, ProgressOutHttpEntity entity) {
HttpClient httpClient = new DefaultHttpClient(); httpClient.getParams().setParameter( CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); // 设置连接超时时间 httpClient.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(entity); try {
HttpResponse httpResponse = httpClient.execute(httpPost); if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
return "文件上传成功"; } } catch (ClientProtocolException e) {
e.printStackTrace(); } catch (ConnectTimeoutException e) {
e.printStackTrace(); } catch (Exception e) {
e.printStackTrace(); } finally {
if (httpClient != null && httpClient.getConnectionManager() != null) {
httpClient.getConnectionManager().shutdown(); } } return "文件上传失败"; }}

源码下载地址 :

转载请注明: » 

备份下载地址:http://download.csdn.net/detail/jdsjlzx/8486479

你可能感兴趣的文章
CloudStack部署篇一 平台安装
查看>>
centos 安装 配置
查看>>
flashback query
查看>>
写出MVC的三个字母分别代表什么含义
查看>>
NGINX 添加 虚拟主机 VIRTUAL HOST
查看>>
Chapter 02 名称解析的配置 第1课 理解Windows Server 2008中的名称解析
查看>>
mssql 获取表空间大小
查看>>
查看buffer pool数据密度
查看>>
centos7安装中文宋体
查看>>
我的友情链接
查看>>
OpenVAS
查看>>
fedora 17下安装QQ2012
查看>>
我的友情链接
查看>>
LInux iptable总结
查看>>
Citrix XenApp Lic指向设置
查看>>
web虚拟键盘VirtualKeyboard
查看>>
小记-ubuntu安装JDK并配置环境变量
查看>>
我的友情链接
查看>>
支持主流 浏览器 回车事件
查看>>
Servlet和 Struts线程安全问题
查看>>