首页 > 代码库 > Android Http POST文件上传之-----RFC1867协议

Android Http POST文件上传之-----RFC1867协议


RFC1867协议介绍
           RFC1867协议主要是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定了Form的method必须为POST,ENCTYPE必须为multipart/form-data。 其它属性标签, <INPUT TYPE=file>标记可以有一个VALUE属性来指定默认的文件名 可以用“SIZE=宽,高”来指定SIZE属性 。

 

multipart/form-data

       multipart/form-data的媒体内容遵从RFC 1521所规定的多部分的数据流规则。它主要被用来描述表单填写后返回的数据。在一个表单中(这里指的是HTML,当然其他一些应用也可 能使用表单),有一系列字段提供给用户进行填写,每个字段都有自己的名字。在一个确定 的表单中,每个名字都是唯一的。  
       multipart/form-data由多个部分组成,每一部分都有一个content-disposition标题头,它的 值是"form-data",它的属性指明了其在表单内的字段名。举例来说,‘content-disposition:  form-data; name="xxxxx"‘,这里的xxxxx就是对应于该字段的字段名。如果字段名包含非 ASCII码字符的话,还应该按照RFC 1522里面所规定的方法进行编码。  
        对所有的多部分MIME类型来说,每一部分有一个可选的Content-Type,默认的值是 text/plain。如果文件的内容是通过表单填写上传返回的话,那么输入的文件就被定义为 application/octet-stream,或者,如果知道是什么类型的话,就定义为相应的媒体类型。如 果一个表单返回多个文件,那么它们就作为multipart/form-data中所结合的multipart/mixed 被返回。  
如果所传送的内容不符合默认的编码方式的话,该部分都将被编码,并加上 "content-transfer-encoding"的标题头。 


Android Post上传文件的实现

           Android POST方式上传文件,可以基于通过 RFC1867协议来实现。


/**
 * 
 * @param urlPath
 * @param params
 *            map 参数 <参数名称 , 参数值>
 * @param fileParams
 *            map 文件类型 参数 <参数名称 , 文件路径>
 *
 */
public String postFile(String urlPath, Map<String, Object> params,Map<String, String> fileParams) throws FileNotFoundException{
	 String PREFIX = "--";  //前缀
	  String LINE_END = "\r\n"; //换行
	  String BOUNDARY = UUID.randomUUID().toString(); // 边界标识
		URL url;
		HttpURLConnection connection;
		try {
			 
				url = new URL(urlPath);
			  
				connection = (HttpURLConnection) url.openConnection();
				//设置超时时间
				connection.setReadTimeout(readTimeOut);  
				connection.setConnectTimeout(connectTimeOut);
				// 请求方式
				connection.setRequestMethod("POST"); 
				connection.setRequestProperty("X-Requested-With", "XMLHttpRequest");
				//开启输入流
				connection.setDoInput(true);
				//开启输出流
				connection.setDoOutput(true);
				//关闭缓存
				connection.setUseCaches(false);
				 // 设置编码
				connection.setRequestProperty("Charset", "utf-8");
				connection.setRequestProperty("connection", "keep-alive");
				connection.setRequestProperty("user-agent",
						"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
				//设置内容类型及定义BOUNDARY
				connection.setRequestProperty("Content-Type",  "multipart/form-data" + ";boundary="
					+ BOUNDARY);
				
			 
				//获取输出流
				DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
				StringBuffer sb = null;
			 
				String result = "";
				String paramStr;
				//发送非文件参数
				if (mParams != null && mParams.size() > 0) {

				Iterator<String> it = mParams.keySet().iterator();
				while (it.hasNext()) {
					sb = null;
					sb = new StringBuffer();
					String key = it.next();
					Object value = http://www.mamicode.com/mParams.get(key);>