android post方式上传文件(模拟表单格式数据提交)

表单提交内容为:

POST /upload.php?zp_id=ab46ca6d703e3a1580c1c9b8b3a8fb39 HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://campus.eastmoney.com/upload/uploadf.php?zp_id=ab46ca6d703e3a1580c1c9b8b3a8fb39
Accept-Language: zh-cn
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)
Content-Type: multipart/form-data; boundary=---------------------------7de8c1a80910
Accept-Encoding: gzip, deflate
Host: campus.eastmoney.com
Content-Length: 8636
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: emstat_bc_emcount=7843405732305291404; emstat_ss_emcount=104_1395241887_3077552069; zp_id=ab46ca6d703e3a1580c1c9b8b3a8fb39; zp_tag=%C8%CB%CA%C2%D6%FA%C0%ED%A3%A8%C8%CB%C1%A6%D7%CA%D4%B4%B2%BF%A3%A9; PHPSESSID=e4820e25c1ced88e0e677ed9610f3f56

-----------------------------7de8c1a80910
Content-Disposition: form-data; name="__VIEWSTATE"


-----------------------------7de8c1a80910
Content-Disposition: form-data; name="txtFileSer"


-----------------------------7de8c1a80910
Content-Disposition: form-data; name="txtSeqID"

94564504-c3bd-44c1-8048-e1195f701c9b
-----------------------------7de8c1a80910
Content-Disposition: form-data; name="txtAlias"


-----------------------------7de8c1a80910
Content-Disposition: form-data; name="txtSourceID"

8619075e-952c-45d5-90e7-43d80e1e7f40
-----------------------------7de8c1a80910
Content-Disposition: form-data; name="txtCname"


-----------------------------7de8c1a80910
Content-Disposition: form-data; name="txtUpLoad"; filename="ss.jpg"
Content-Type: image/pjpeg

籿湈x=*旫?;?欋芳管搪O*kbpU#m噡


-----------------------------7de8c1a80910
Content-Disposition: form-data; name="btnUpload"

上传
-----------------------------7de8c1a80910--

 

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;

import com.eastmoney.util.FileUtil;

public class HttpAssistant implements Runnable {
	public static final int REQUEST_ERROR = 0xFFF;
	public static final int URL_MARLFORMED_ERROR = 0xFFE;
	public static final int IO_EXCEPTION_REEOR = 0xFFD;
	public static final int RESPONSE_SUCCESS = 0xFFC;

	final int CONNECT_TIME_OUT = 10000;
	final int READ_TIME_OUT = 10000;
	String requestString;
	HttpResponseCallback mCallback;
	RequestType type;
	HashMap<String, String> params;

	/**
	 * @param requestString
	 *            请求字串
	 * @param callback
	 *            请求结果回调
	 * @param type
	 *            请求类型(GET/POST)
	 * @param params
	 *            post请求参数
	 */
	public HttpAssistant(String requestString, HttpResponseCallback callback,
			RequestType type, HashMap<String, String> params) {
		this.requestString = requestString;
		this.mCallback = callback;
		this.type = type;
		this.params = params;
	}

	@Override
	public void run() {
		if (type == null) {
			throw new IllegalArgumentException(
					"NetworkRequest must specify a request type");
		}
		StringBuilder sb = new StringBuilder();
		HttpURLConnection conn = null;
		if (type == RequestType.GET || type == RequestType.GET_THUMBNAIL
				|| type == RequestType.GET_AUDIO
				|| type == RequestType.GET_IMAGE) {
			// GET请求
			try {
				URL url = new URL(requestString);
				conn = (HttpURLConnection) url.openConnection();
				conn.setConnectTimeout(CONNECT_TIME_OUT);
				conn.setReadTimeout(READ_TIME_OUT);
				conn.connect();
				InputStream is = conn.getInputStream();
				if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
					if (mCallback != null) {
						mCallback.onResponse(REQUEST_ERROR, null);
					}
					conn.disconnect();
					return;
				}
				if (type == RequestType.GET) {
					BufferedReader br = new BufferedReader(
							new InputStreamReader(is));
					String line = null;
					sb.setLength(0);
					while ((line = br.readLine()) != null) {
						sb.append(line);
					}
					if (mCallback != null) {
						mCallback.onResponse(RESPONSE_SUCCESS, sb.toString());
					}
				} else {
					File file = null;
					if (type == RequestType.GET_THUMBNAIL) {
						file = FileUtil.createCacheFile(
								String.valueOf(requestString.hashCode()),
								FileUtil.Type.THUMBNAIL);
					} else if (type == RequestType.GET_IMAGE) {
						file = FileUtil.createCacheFile(
								String.valueOf(requestString.hashCode()),
								FileUtil.Type.IMAGE);
					} else if (type == RequestType.GET_AUDIO) {
						file = FileUtil.createCacheFile(
								String.valueOf(requestString.hashCode()),
								FileUtil.Type.AUDIO);
					}
					if (file == null) {
						if (mCallback != null) {
							mCallback.onResponse(IO_EXCEPTION_REEOR, null);
						}
						return;
					}
					FileOutputStream fos = new FileOutputStream(file);
					byte[] buffer = new byte[1024];
					int length = 0;
					while ((length = is.read(buffer)) != -1) {
						fos.write(buffer, 0, length);
					}
					fos.flush();
					fos.close();
					if (mCallback != null) {
						mCallback.onResponse(RESPONSE_SUCCESS, file);
					}
					buffer = null;
					System.gc();
				}
				conn.disconnect();
				return;
			} catch (MalformedURLException e) {
				if (mCallback != null) {
					mCallback.onResponse(URL_MARLFORMED_ERROR, null);
				}
			} catch (IOException e) {
				if (mCallback != null) {
					mCallback.onResponse(IO_EXCEPTION_REEOR, null);
				}
			} finally {
				if (conn != null) {
					conn.disconnect();
				}
			}
		} else if (type == RequestType.POST_IMAGE
				|| type == RequestType.POST_AUDIO) {
			if (params == null) {
				throw new IllegalArgumentException(
						"Post request must specify arguments");
			}
			// 数据分割线
			String BOUNDARY = "---------------------------7de8c1a80910";
			// POST请求
			try {
				URL url = new URL(requestString);
				conn = (HttpURLConnection) url.openConnection();
				conn.setConnectTimeout(CONNECT_TIME_OUT);
				conn.setDoOutput(true);
				conn.setDoInput(true);
				conn.setUseCaches(false);
				conn.setReadTimeout(READ_TIME_OUT);
				conn.setRequestMethod("POST");
				conn.setRequestProperty("Connection", "Keep-Alive");
				conn.setRequestProperty("Charset", "UTF-8");
				conn.setRequestProperty(
						"User-Agent",
						"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)");
				conn.setRequestProperty("Content-Type",
						"multipart/form-data; boundary=" + BOUNDARY);
				// 末尾数据分隔符
				byte[] endData = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();
				// 数据输出流
				DataOutputStream dos = new DataOutputStream(
						conn.getOutputStream());
				// 构建post数据
				sb.setLength(0);
				Iterator<String> i = params.keySet().iterator();
				while (i.hasNext()) {
					String key = i.next();
					if (!key.equals("txtUpLoad")) {
						// 向输出流中填写普通文本数据
						sb.append("\r\n\r\n\r\n--" + BOUNDARY + "\r\n");
						sb.append("Content-Disposition: form-data; name=\""
								+ key + "\"" + "\r\n\r\n");
						sb.append(params.get(key) + "\r\n");
						dos.write(sb.toString().getBytes());
						sb.setLength(0);
					} else {
						// 向输出流中填写上传的文件数据
						sb.append("\r\n\r\n--" + BOUNDARY + "\r\n");
						sb.append("Content-Disposition: form-data; name=\"txtUpLoad\"; filename=\""
								+ params.get("txtUpLoad") + "\"" + "\r\n");
						if (type == RequestType.POST_IMAGE) {
							sb.append("Content-Type: image/*\r\n\r\n");
						} else {
							sb.append("Content-Type: audio/*\r\n\r\n");
						}
						dos.write(sb.toString().getBytes());
						sb.setLength(0);
						// 传输文件数据
						FileInputStream fis = new FileInputStream(new File(
								params.get("txtUpLoad")));
						byte[] buffer = new byte[1024];
						int length = 0;
						while ((length = fis.read(buffer)) != -1) {
							dos.write(buffer, 0, length);
						}
						fis.close();
					}
				}
				dos.write(endData);
				// 刷新输出流
				dos.flush();
				dos.close();
				// 获取返回数据
				InputStream is = conn.getInputStream();
				if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
					if (mCallback != null) {
						mCallback.onResponse(REQUEST_ERROR, null);
					}
					conn.disconnect();
					return;
				}
				sb.setLength(0);
				BufferedReader br = new BufferedReader(
						new InputStreamReader(is));
				String line = null;
				while ((line = br.readLine()) != null) {
					sb.append(line);
				}
				if (mCallback != null) {
					mCallback.onResponse(RESPONSE_SUCCESS, sb.toString());
				}
				conn.disconnect();
			} catch (MalformedURLException e) {
				if (mCallback != null) {
					mCallback.onResponse(URL_MARLFORMED_ERROR, null);
				}
			} catch (IOException e) {
				if (mCallback != null) {
					mCallback.onResponse(IO_EXCEPTION_REEOR, null);
				}
			} finally {
				if (conn != null) {
					conn.disconnect();
				}
			}
		}
	}

	/** 设置网络请求回调. */
	public void setCallback(HttpResponseCallback callback) {
		this.mCallback = callback;
	}

	/** 网络请求回调接口. */
	public static interface HttpResponseCallback {
		public void onResponse(int responseCode, Object responseObject);
	}

	public static enum RequestType {
		/** 一般get请求,返回数据为字符串 */
		GET,
		/** 获取头像缩略图. */
		GET_THUMBNAIL,
		/** 获取图片文件. */
		GET_IMAGE,
		/** 获取音频文件 */
		GET_AUDIO,
		/** post请求,上传数据为image */
		POST_IMAGE,
		/** post请求,上传数据为audio */
		POST_AUDIO;
	}
}

  

android post方式上传文件(模拟表单格式数据提交),布布扣,bubuko.com

android post方式上传文件(模拟表单格式数据提交)

上一篇:详解Android ActionBar之二:ActionBar添加Tabs标签和下拉导航


下一篇:Android 隐藏Fragment