Android实现文件上传(使用Android-ansync-http)

Android-ansync-http开源框架,详情见GitHub:https://github.com/loopj/android-async-http

Android端实现文件的上传,代码如有雷同纯属开源!

服务端实现(使用Servlet):

UpLoadServle.java(只贴关键代码,剩下的自动生成的就不了。。。),用到的jar包commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        this.doPost(request, response);
}

关键看这里

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        if (isMultipart) {// 判断提交上来的数据是否是表单的数据
            //文件存放位置:服务目录下的upload(如:默认TomCat部署目录X:\Workspace\.metadata\.me_tcat\webapps\工程名\upload)
            String realPath = getServletContext().getRealPath("upload");
            File dir = new File(realPath);
            if (!dir.exists()) {
                dir.mkdir();
            }

            DiskFileItemFactory factory = new DiskFileItemFactory();// 1、创建一个DiskFileItemFactory工厂
            ServletFileUpload upload = new ServletFileUpload(factory);// 2、创建一个文件上传解析器
            upload.setHeaderEncoding("utf-8");//编码方式

            try {
                // 4、使用ServletFileUpload解析器解析上传的数据,解析结果是一个List<FileItem>
                // 集合,每一个FileItem对应一个Form表单的输入项
                List<FileItem> items = upload.parseRequest(request);

                for (FileItem item : items) {
                    if (item.isFormField()) {//如果是文本
                        String name = item.getFieldName();
                        String value = item.getString("utf-8");//以utf-8进行编码
                        System.out.println(name);
                    } else {// 如果是文件
                        String filename = item.getName();
                        // System.out.println("filename=" + filename);
                        if (null == filename || "".equals(filename.trim())) {
                            continue;
                        }
                        filename = filename.substring(filename
                                .lastIndexOf("\\") + 1);//将文件名剪出
                        InputStream is = item.getInputStream();//得到上传的输入流
                        FileOutputStream out = new FileOutputStream("F:\\"
                                + filename);//创建写入磁盘的输出流

                        byte[] b = new byte[1024 * 1024];//缓冲区
                        int len = 0;
                        while ((len = is.read(b)) != -1) {
                            out.write(b, 0, len);
                            out.flush();
                        }
                        is.close();
                        out.close();
                        // 处理文件上传时生成的临时文件
                        item.delete();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
}

别忘了在web.xml注册servlet

<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>UpLoadServlet</servlet-name>
    <servlet-class>com.ql.UpLoadServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UpLoadServlet</servlet-name>
    <url-pattern>/UpLoadServlet</url-pattern>
  </servlet-mapping>

服务器端完工。。。

Android端

界面:
这里写图片描述

Java代码:用到的jar包android-async-http-1.4.9.jar,httpclient-4.4.1.1.jar
直接贴代码,懒得分了

package com.ql.fileuploaddemo;

import java.io.File;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import cz.msebera.android.httpclient.Header;

public class MainActivity extends Activity {

    private static final int FILE_SELECT_CODE = 0;

    protected static final String TAG = "QL";

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                String path = (String) msg.obj;
                editText.setText(path);
            }
            if (msg.what == 2) {
                int progress = (int) msg.arg1;
                MainActivity.this.progressBar.setProgress(progress);
                int a = msg.arg2;
                textView.setText(a + "%");
            }
            if (msg.what == 3) {
                String string = (String) msg.obj;
                textView2.setText("" + string);
            }
        }
    };

    private EditText editText;
    private ProgressBar progressBar;
    private TextView textView;

    private TextView textView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editText = (EditText) findViewById(R.id.editText1);
        progressBar = (ProgressBar) findViewById(R.id.progressBar1);
        textView = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);

        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showFileChooser();
            }
        });

        Button button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                UpLoad();
            }
        });
    }

    /**
     * 上传
     */
    protected void UpLoad() {
        progressBar.setProgress(0);
        AsyncHttpClient client = new AsyncHttpClient();//实例化上传对象
        String url = "http://10.86.30.38:8080/UpLoad/UpLoadServlet";//url组成:ip:端口 + 服务端工程名 + servlet名
        String path = editText.getText().toString().trim();

        if (null != path && "" != path) {
            File file = new File(path);
            if (file.exists() && file.length() > 0) {
                RequestParams params = new RequestParams();
                try {
                    params.put("profile", file);//将文件加入参数
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //上传文件
                client.post(url, params, new AsyncHttpResponseHandler() {

                    @Override//失败的监听
                    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                        Message msg = handler.obtainMessage();
                        msg.what = 3;
                        msg.obj = "上传失败!";
                        handler.sendMessage(msg);
                        error.printStackTrace();
                    }

                    @Override//成功的监听
                    public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                        Message msg = handler.obtainMessage();
                        msg.what = 3;
                        msg.obj = "上传成功!";
                        handler.sendMessage(msg);
                    }

                    @Override//动态变化
                    public void onProgress(final long bytesWritten, final long totalSize) {
                        super.onProgress(bytesWritten, totalSize);
                        progressBar.setMax((int) totalSize);
                        float a = (float) bytesWritten / (float) totalSize;
                        Message msg = handler.obtainMessage();
                        msg.what = 2;
                        msg.arg1 = (int) bytesWritten;
                        msg.arg2 = (int) (a * 100f);
                        handler.sendMessage(msg);
                    }
                });
            }

        }
    }

    /**
     * 选择文件
     */
    private void showFileChooser() {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType("*/*");//过滤文件类型(所有)
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        try {
            startActivityForResult(Intent.createChooser(intent, "请选择文件!"), FILE_SELECT_CODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(this, "未安装文件管理器!", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
        case FILE_SELECT_CODE:
            if (resultCode == RESULT_OK) {
                Uri uri = data.getData();
                String path = FileUtils.getPath(this, uri);//得到文件路径
                Message msg = handler.obtainMessage();
                msg.what = 1;
                msg.obj = path;
                handler.sendMessage(msg);
            }
            break;
        }
    }

    /**
     * 文件工具类
     * @author ql
     *
     */
    static class FileUtils {
        public static String getPath(Context context, Uri uri) {

            if ("content".equalsIgnoreCase(uri.getScheme())) {
                String[] projection = { "_data" };
                Cursor cursor = null;

                try {
                    cursor = context.getContentResolver().query(uri, projection, null, null, null);
                    int column_index = cursor.getColumnIndexOrThrow("_data");
                    if (cursor.moveToFirst()) {
                        return cursor.getString(column_index);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if ("file".equalsIgnoreCase(uri.getScheme())) {
                return uri.getPath();
            }
            return null;
        }
    }

}

别忘了给权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

效果:
这里写图片描述

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值