Android使用HttpClient实现文件上传到PHP服务器,并监控进度条



上传

服务器端PHP

代码如下 :

<?php
    $target_path  = "./tmp/";//接收文件目录
    $target_path = $target_path.($_FILES['file']['name']);
    $target_path = iconv("UTF-8","gb2312", $target_path);
    if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
       echo "The file ".( $_FILES['file']['name'])." has been uploaded.";
    }else{
       echo "There was an error uploading the file, please try again! Error Code: ".$_FILES['file']['error'];
    }
?>

监控进度实现

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

//进度监听器接口

public interface ProgressListener {
    public void transferred(long transferedBytes);
}

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

 // ProgressOutHttpEntity:输出流(OutputStream)时记录已发送字节数

public class ProgressOutHttpEntity extends HttpEntityWrapper {

    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 long 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.wrappedEntity.writeTo(out instanceof CountingOutputStream ? out
                : new CountingOutputStream(out, this.listener));
    }
}

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

public class FileUploadAsyncTask extends AsyncTask<File, Integer, String> {

    private String url = "http://192.168.83.213/receive_file.php";
    private Context context;
    private ProgressDialog pd;
    private long 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(long 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 "文件上传失败";
    }

}

源码下载地址 :下载

转载请注明:安度博客 » Android使用HttpClient实现文件上传到PHP服务器,并监控进度条

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

时间: 2024-10-18 11:39:58

Android使用HttpClient实现文件上传到PHP服务器,并监控进度条的相关文章

libcurl-curl到底能不能实现文件上传到第三方服务器

问题描述 curl到底能不能实现文件上传到第三方服务器 网上看到的curl,那些命令都是最基本的东西,都是什么模拟上传, 测试的结果都是本地搭的服务器, ①如果用curl命令,到底能不能实现上传一个文件到百度云盘,首先就是登陆到百度云盘,它可以吗? ②如果不在libcurl里自己写,就登陆而言curl命令知道要POST的表单里数据有什么吗(username,password,autolog...?)?显然是不知道啊. 那这么命令到底能干啥? ③就算在libcurl里,自己写出了登陆到百度云的程序

java web-如何用jsp实现将文件上传至Tomcat服务器上,并可以下载

问题描述 如何用jsp实现将文件上传至Tomcat服务器上,并可以下载 在做一个资源管理系统,现在需要实现将文件上传至Tomcat服务器下的并在另外的页面可以实现下载的功能,除了知道这是需要上传至Tomcat服务器下之外,什么都不会,不知道怎么实现,也不知道要怎么写代码,希望各位路过的大侠指教!!!还有一个问题就是,要怎么实现已上传文件的预览呢?原谅我是个技术渣吧...感谢大家!!! 解决方案 需要借助插件的,代码还是得自己探索的.参考下这个http://bbs.csdn.net/topics/

java实现将文件上传到ftp服务器的方法_java

本文实例讲述了java实现将文件上传到ftp服务器的方法.分享给大家供大家参考,具体如下: 工具类: package com.fz.common.util; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; imp

flashupload文件-FlashUpload文件上传 本地可以 服务器报There has been an I/O Error:#2038

问题描述 FlashUpload文件上传 本地可以 服务器报There has been an I/O Error:#2038 我在本地iis运行,上传没有问题,可是网页访问服务器的,上传就会报这个错误: There has been an I/O Error:#2038 There has been an HTTP Error:status code 404 问题跟 http://s.yanghao.org/program/viewdetail.php?i=94390 一样. 本地iis是6.

文件上传到linux服务器 文件名为乱码

问题描述 我在windows系统 用fileupload上传包含中文文件名的文件,上传到linux服务器后文件名为乱码.我用乱码字符串做 GBK转UTF-8可以变为正常原本想在上传后先用程序重命名一遍UTF-8转GBK的文件名,但是出现了另外一种乱码.请教知道这个问题的解决方法或原因,谢谢.另外我用程序创建一个文件也会出现这种乱码. 问题补充:asyty 写道 解决方案 你的shell的编码字符集呢?为啥乱码是你想要的.....可以先把shell设置成utf-8再看看 你java传上去的竟然还是

php把文件上传到远程服务器上例子

我这里写的是用curl的代码 本地代码如下:  代码如下 复制代码 <?php     header('content-type:text/html;charset=utf8');     $curl = curl_init();     $data = array('img'=>'@'. dirname(__FILE__).'/img/login.gif');     curl_setopt($curl, CURLOPT_URL, "http://www.demo.com/uplo

自动写入文件上传到指定服务器SoftwareMeteringCLS.vbs源码_vbs

复制代码 代码如下: ' FileName: SoftwareMeteringCLS.vbs ' //////////////////////////////////////////////////////////////////// If (WScript.ScriptName = "SoftwareMeteringCLS.vbs") Then Call demo_SoftwareMeteringCLS() ' ====================================

Android带进度条的文件上传示例(使用AsyncTask异步任务)_Android

最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. demo运行截图: AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传.AsyncTask定义了三种泛型类型Params,Progress和Result. 1.Params 启动任务执行的输入参数,比

Android带进度条的文件上传示例(使用AsyncTask异步任务)

最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可. demo运行截图: AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p),在此方法中实现任务的执行工作,比如联网下载或上传.AsyncTask定义了三种泛型类型Params,Progress和Result. 1.Params 启动任务执行的输入参数,比