Android 上传图片和文本数据到服务器

Android 上传图片和文本数据到服务器

    Android客户端和服务器基于HTTP协议相互通信,通过拼接HTTP报文模拟form 表单的post方式发送图片和数据。如下所示,是一个form表单,用户可以在表单中添加文本和文件(图片)并点击提交按钮post数据至服务器上。

form表单的代码如下:
<form method="post" enctype="multipart/form-data">
    <p>文本:<input type = "text" name="text" /></p>
    <p>图片:<input type="file" name="picture" /></p>
    <p><input type="submit" value="提交"></p>
</form>
点击“提交”按钮后,发送的HTTP报文如下:


其中红色的部分是报文的核心,我们的主要工作就是在Android客户端拼接红色部分的报文,首先新建一个测试用的Activity
TestActivity.java:
package neu.dreamera.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import neu.dreamera.R;
import neu.dreamera.utils.FileCacheUtil;
import neu.dreamera.utils.HttpConnectionUtil;

public class TestActivity extends AppCompatActivity {

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

        final String url = "http://*******"; //此处写上自己的URL
        
        final Map<String,Object> paramMap = new HashMap<String, Object>(); //文本数据全部添加到Map里
        paramMap.put("title","test");
        paramMap.put("datetime", "1890-06-08T08:08:00Z");
        paramMap.put("time_str", "my test");
        paramMap.put("place", "120");

        String path = "********"; //此处写上要上传的文件在系统中的路径
        final File pictureFile = new File(path); //通过路径获取文件

        //开启一个新线程,向服务器上传数据
        new Thread(){
            public void run(){
                try{
                    HttpConnectionUtil.doPostPicture(url, paramMap, pictureFile);
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}
HttpConnectionUtil.java:
package neu.dreamera.utils;

/**
 * Created by 10405 on 2016/6/6.
 */

import android.app.Activity;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

public class HttpConnectionUtil {

    static String BOUNDARY = java.util.UUID.randomUUID().toString();
    static String PREFIX = "--", LINEND = "\r\n";
    static String MULTIPART_FROM_DATA = "multipart/form-data";
    static String CHARSET = "UTF-8";

    public static void doPostPicture(String urlStr, Map<String,Object> paramMap, File pictureFile )
            throws Exception{

        URL url = new URL(urlStr);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();

        conn.setDoInput(true);// 允许输入
        conn.setDoOutput(true);// 允许输出
        conn.setUseCaches(false);
        conn.setReadTimeout(10 * 1000); // 缓存的最长时间
        conn.setRequestMethod(POST);

        conn.setRequestProperty("Charset", "UTF-8");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY);


        DataOutputStream os =  new DataOutputStream(conn.getOutputStream());

        StringBuilder sb = new StringBuilder(); //用StringBuilder拼接报文,用于上传图片数据
        sb.append(PREFIX);
        sb.append(BOUNDARY);
        sb.append(LINEND);
        sb.append("Content-Disposition: form-data; name=\"picture\"; filename=\"" + pictureFile.getName() + "\"" + LINEND);
        sb.append("Content-Type: image/jpg; charset=" + CHARSET + LINEND);
        sb.append(LINEND);
        os.write(sb.toString().getBytes());
        InputStream is = new FileInputStream(pictureFile);

        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = is.read(buffer)) != -1) {
            os.write(buffer, 0, len); //写入图片数据
        }
        is.close();
        os.write(LINEND.getBytes());

        StringBuilder text = new StringBuilder();
        for(Map.Entry<String,Object> entry : paramMap.entrySet()) { //在for循环中拼接报文,上传文本数据
            text.append("--");
            text.append(BOUNDARY);
            text.append("\r\n");
            text.append("Content-Disposition: form-data; name=\""+ entry.getKey() + "\"\r\n\r\n");
            text.append(entry.getValue());
            text.append("\r\n");
        }
        os.write(text.toString().getBytes("utf-8")); //写入文本数据

        // 请求结束标志
        byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
        os.write(end_data);
        os.flush();
        os.close();

        // 得到响应码
        int res = conn.getResponseCode();
        System.out.println("asdf code "+ res);
        System.out.println("asdf " + conn.getResponseMessage());
        conn.disconnect();
    }

}



    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值