android 上传文件到服务器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 上传文件到服务器相关的知识,希望对你有一定的参考价值。

Android客户端

package com.example.testandroid;
 
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
public class PhotoUpload extends Activity {
    private String newName = "image.jpg";
    private String uploadFile = "/sdcard/image.JPG";// 要上传的文件
    private String actionUrl = "http://192.168.0.1:8080/PhotoUpload/servlet/UploadServlet";
    private TextView mText1;
    private TextView mText2;
    private Button mButton;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mText1 = (TextView) findViewById(R.id.myText2);
        // 文件路径:
        mText1.setText(uploadFile);
        mText2 = (TextView) findViewById(R.id.myText3);
        // 上传网址:
        mText2.setText(actionUrl);
        /* 设置mButton的onClick事件处理 */
        mButton = (Button) findViewById(R.id.myButton);
        mButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                uploadFile();
            }
        });
    }
 
    /* 上传文件至Server的方法 */
    private void uploadFile() {
        String end = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        try {
            URL url = new URL(actionUrl);
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            /* 允许Input、Output,不使用Cache */
            con.setDoInput(true);
            con.setDoOutput(true);
            con.setUseCaches(false);
 
            // 设置http连接属性
            con.setRequestMethod("POST");
            con.setRequestProperty("Connection""Keep-Alive");
            con.setRequestProperty("Charset""UTF-8");
            con.setRequestProperty("Content-Type",
                    "multipart/form-data;boundary=" + boundary);
 
            DataOutputStream ds = new DataOutputStream(con.getOutputStream());
            ds.writeBytes(twoHyphens + boundary + end);
            ds.writeBytes("Content-Disposition: form-data; "
                    "name=\"file1\";filename=\"" + newName + "\"" + end);
            ds.writeBytes(end);
 
            // 取得文件的FileInputStream
            FileInputStream fStream = new FileInputStream(uploadFile);
            /* 设置每次写入1024bytes */
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            int length = -1;
            /* 从文件读取数据至缓冲区 */
            while ((length = fStream.read(buffer)) != -1) {
                /* 将资料写入DataOutputStream中 */
                ds.write(buffer, 0, length);
            }
            ds.writeBytes(end);
            ds.writeBytes(twoHyphens + boundary + twoHyphens + end);
 
            fStream.close();
            ds.flush();
            /* 取得Response内容 */
            InputStream is = con.getInputStream();
            int ch;
            StringBuffer b = new StringBuffer();
            while ((ch = is.read()) != -1) {
                b.append((char) ch);
            }
            /* 将Response显示于Dialog */
            showDialog("上传成功" + b.toString().trim());
            /* 关闭DataOutputStream */
            ds.close();
        catch (Exception e) {
            showDialog("上传失败" + e);
        }
    }
 
    /* 显示Dialog的method */
    private void showDialog(String mess) {
        new AlertDialog.Builder(PhotoUpload.this).setTitle("Message")
                .setMessage(mess)
                .setNegativeButton("确定"new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                    }
                }).show();
    }
}



服务器端servlet

package com.demo;
 
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
 
public class UploadServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
 
        String temp = request.getSession().getServletContext().getRealPath("/")
                "temp"// 临时目录
        System.out.println("temp=" + temp);
        String loadpath = request.getSession().getServletContext()
                .getRealPath("/")
                "Image"// 上传文件存放目录
        System.out.println("loadpath=" + loadpath);
        DiskFileUpload fu = new DiskFileUpload(); // 需要导入commons-fileupload-1.2.2.jar
                                                    // http://commons.apache.org/fileupload/
        fu.setSizeMax(1 1024 1024); // 设置允许用户上传文件大小,单位:字节
        fu.setSizeThreshold(4096); // 设置最多只允许在内存中存储的数据,单位:字节
        fu.setRepositoryPath(temp); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
 
        // 开始读取上传信息
        int index = 0;
        List fileItems = null;
 
        try {
            fileItems = fu.parseRequest(request);
            System.out.println("fileItems=" + fileItems);
        catch (Exception e) {
            e.printStackTrace();
        }
 
        Iterator iter = fileItems.iterator(); // 依次处理每个上传的文件
        while (iter.hasNext()) {
            FileItem item = (FileItem) iter.next();// 忽略其他不是文件域的所有表单信息
            if (!item.isFormField()) {
                String name = item.getName();// 获取上传文件名,包括路径
                name = name.substring(name.lastIndexOf("\\") + 1);// 从全路径中提取文件名
                long size = item.getSize();
                if ((name == null || name.equals("")) && size == 0)
                    continue;
                int point = name.indexOf(".");
                name = (new Date()).getTime()
                        + name.substring(point, name.length()) + index;
                index++;
                File fNew = new File(loadpath, name);
                try {
                    item.write(fNew);
                catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
 
            else// 取出不是文件域的所有表单信息
            {
                String fieldvalue = item.getString();
                // 如果包含中文应写为:(转为UTF-8编码)
                // String fieldvalue = new
                // String(item.getString().getBytes(),"UTF-8");
            }
        }
        String text1 = "11";
        response.sendRedirect("result.jsp?text1=" + text1);
    }
}


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <EditText
        android:id="@+id/myText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="116dp"
        android:ems="10"
        android:inputType="textPersonName" />
 
    <EditText
        android:id="@+id/myText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/myText2"
        android:layout_below="@+id/myText2"
        android:layout_marginTop="45dp"
        android:ems="10" />
 
    <Button
        android:id="@+id/myButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/myText3"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="61dp"
        android:text="上传" />
 
</RelativeLayout>

以上是关于android 上传文件到服务器的主要内容,如果未能解决你的问题,请参考以下文章

Android客户端与Python服务器端通信之上传图片

android 上传文件到服务器

使用客户端证书和 Android 的 HttpsURLConnection 通过 SSL 上传文件

android中如何上传图片到FTP服务器

将文本文件从 Android 上传到 Rails 会导致内容类型欺骗错误

android批量文件上传(android批量图片上传)