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 = mParams.get(key);
sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
sb.append("Content-Disposition: form-data; name=\"")
.append(key).append("\"").append(LINE_END)
.append(LINE_END);
sb.append(value).append(LINE_END);
paramStr = sb.toString(); dos.write(paramStr.getBytes());
dos.flush();
}
}
paramStr = null;
// 发送文件參数,读取文件流写入post输出流
if (mFileParams != null && !mFileParams.isEmpty()) { Iterator<Entry<String, String>> fileIter = mFileParams
.entrySet().iterator(); while (fileIter.hasNext()) {
sb = null;
sb = new StringBuffer();
Entry<String, String> entry = fileIter.next();
String fileKey = entry.getKey();
String filePath = entry.getValue(); File file = new File(filePath); if (file.exists() == false) { throw new FileNotFoundException();
}
// 设置边界标示,设置 Content-Disposition头传入文件流 sb.append(PREFIX).append(BOUNDARY).append(LINE_END);
sb.append("Content-Disposition:form-data; name=\""
+ fileKey + "\"; filename=\"" + file.getName()
+ "\"" + LINE_END);
sb.append("Content-Type:" + CONTENT_TYPE + LINE_END);
sb.append(LINE_END);
dos.write(sb.toString().getBytes()); InputStream is = new FileInputStream(file); byte[] bytes = new byte[1024];
int len = 0; while ((len = is.read(bytes)) != -1) { dos.write(bytes, 0, len); }
is.close();
dos.write(LINE_END.getBytes()); dos.flush();
}
byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINE_END)
.getBytes();
dos.write(end_data);
dos.flush();
}
dos.close();
int res = getResponseCode();
// 返回成功
if (res == 200) {
InputStream input = conn.getInputStream();
StringBuffer sb1 = new StringBuffer();
int ss;
while ((ss = input.read()) != -1) {
sb1.append((char) ss);
}
result = sb1.toString();
return result;
} else {
}
} catch (MalformedURLException e) {
Log.i(TAG, "MalformedURLException error");
} catch (IOException e) {
Log.i(TAG, "IOException error");
}
return null;
}
</pre><pre>
文章地址 :http://blog.csdn.net/jmq_0000/article/details/30244297
Android Http POST文件上传之-----RFC1867协议的更多相关文章
- Android+jsp +html 文件上传案例 已测试 成功通过
我文件上传一直是广大读者一个问题 今天就把成功案例写下 javaweb 网页前段 <%@ page language="java" import="java.uti ...
- web端、android端的文件上传
1.web端的文件上传. 这里是利用了第三方的jar包.这里所需要的jar包我已经上传到本博客的资源里了,以下是连接 http://download.csdn.net/detail/caihongsh ...
- Python Socket实现文件上传(TCP协议)
在TCP协议下通过socket模块实现文件上传 #!/usr/bin/env python # -*- coding: utf-8 -*- # desc: tcp_server_file_upload ...
- 【翻译】tus----一个可续传文件上传的开放协议
tus tus是一个可续穿文件上传协议,它以Http协议为载体,统一了一个文件断点续传的标准. 这篇文章翻译自https://tus.io/ 目前该协议版本信息如下: Version: 1.0.0 ( ...
- TCP大文件上传与UDP协议
一.UCP大文件上传(解决粘包问题) ①客户端 import socket, os, json, struct client = socket.socket() client.connect(('12 ...
- Android + https 实现 文件上传
package com.example.wbdream.zigvine; import android.annotation.SuppressLint; import android.app.Acti ...
- 让Android中的webview支持页面中的文件上传
android webview在默认情况下是不支持网页中的文件上传功能的: 如果在网页中有<input type="file" />,在android webview中 ...
- 补习系列(11)-springboot 文件上传原理
目录 一.文件上传原理 二.springboot 文件机制 临时文件 定制配置 三.示例代码 A. 单文件上传 B. 多文件上传 C. 文件上传异常 D. Bean 配置 四.文件下载 小结 一.文件 ...
- 【SpringMVC】SpringMVC 实现文件上传
SpringMVC 实现文件上传 文章源码 文件上传回顾 查看 JavaWeb 阶段的文件上传下载 实现步骤: 客户端: 发送 post 请求,告诉服务器要上传什么文件 服务器: 要有一个 form ...
随机推荐
- 【洛谷 P1337】[JSOI2004]平衡点 / 吊打XXX (模拟退火)
题目链接 正解就算了吧,谁叫我理生化 语数外 政史地都菜呢 模拟退火真玄学,不知道发生了什么就跑出答案了,原理就算了吧,能用(pianfen)就好. 当重物平衡时,势能一定是最小的,于是当我随机出一个 ...
- HDU 2036 改革春风吹满地 (数学)
题目链接 Problem Description " 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道 ...
- bzoj 1025 DP
这道题根据群论的基础知识,我们可以转化成将n拆分成若干数,求这些数 的lcm的方案数 先筛下素数表prime 那么我们可以用DP来解决这个问题,用W[I,J]代表I这个数,拆成若干个数, 其中质因数最 ...
- Logistic函数
Logistic函数(又称sigmoid函数) Logistic函数或Logistic曲线是一种常见的S形函数,它是皮埃尔·弗朗索瓦·韦吕勒在1844或1845年在研究它与人口增长的关系 ...
- 转:java读取配置文件的几种方法
转自: http://www.iteye.com/topic/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小 ...
- php使用curl模拟登录带验证码的网站
需求是这样的,需要登录带验证码的网站,获取数据,但是不可能人为一直去记录数据,想通过自动采集的方式进行,如下是试验出来的结果代码!有需要的可以参考下! <?php namespace Home\ ...
- vim的插件管理与配置
vim作为我做喜欢的编辑器,可扩展性几乎是没有尽头的,前阵子一直在配置这.vimrc文件,原来搞过配色文件,现在主要就自动补全来设置下,同时作为自己配置的记录文档.……………………………………………… ...
- locust===官方说明文档,关于tasks
安装: >>> pip install locust locust在官方simple_code中如下: from locust import HttpLocust, TaskSet ...
- 【 Linux 】为lnmp架构添加memcached支持
一.首先搭建lnmp平台,这里不再演示.通过php页面来进行测试如下: [root@node1 ~]# vim /usr/local/nginx/html/info.php <?php $lin ...
- BZOJ 3038 上帝造题的七分钟二
无题目 但是百度会发现题目和3211基本一致 所以看上一篇博文的上一篇博文呢