httpurlconnection模拟post提交form表单(普通文本和上传文件) (
http://blog.sina.com.cn/s/blog_8417657f0101gvpc.html
用HttpUrlConnection模拟post表单进行文件上传平时很少使用,比较麻烦。
原理是: 分析文件上传的数据格式,然后根据格式构造相应的发送给服务器的字符串。
格式如下:这里的httppost123是我自己构造的字符串,可以是其他任何的字符串
----------httppost123 (\r\n)
Content-Disposition: form-data; name="img"; filename="t.txt"
(\r\n)
Content-Type: application/octet-stream (\r\n)
(\r\n)
sdfsdfsdfsdfsdf (\r\n)
----------httppost123 (\r\n)
Content-Disposition: form-data; name="text" (\r\n)
(\r\n)
text tttt (\r\n)
----------httppost123-- (\r\n)
(\r\n)
上面的(\r\n)表示各个数据必须以(\r\n)结尾。
package com.haitai.IntelligentAdapters.common;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpMultipartRequest {
//每个post参数之间的分隔
static final
String BOUNDARY =
"----MyFormBoundarySMFEtUYQG6r5B920"; //
定义数据分隔线
private
String urlStr; // 连接的地址
private
List<String[]>
strParams; // 文字post项集 strParams 1:key
2:value
private
List<String[]>
fileParams; // 文件的post项集 fileParams 1:fileField,
2.fileName, 3.fileType,
4.filePath
public
HttpMultipartRequest(String urlStr,
List<String[]> strParams,
List<String[]> fileParams)
{
this.urlStr = urlStr;
this.strParams = strParams;
this.fileParams = fileParams;
}
public
byte[] sendPost() throws Exception
{
HttpURLConnection hc = null; //http连接器
ByteArrayOutputStream
bos =
null;//byte输出流,用来读取服务器返回的信息
InputStream is =
null;//输入流,用来读取服务器返回的信息
byte[] res = null;//保存服务器返回的信息的byte数组
try {
URL url = new URL(urlStr);
hc = (HttpURLConnection)
url.openConnection();
hc.setRequestProperty("Content-Type", "multipart/form-data;
boundary=" + BOUNDARY);
hc.setRequestProperty("Charsert", "UTF-8");
// 发送POST请求必须设置如下两行
hc.setDoOutput(true);
hc.setDoInput(true);
hc.setUseCaches(false);
hc.setRequestMethod("POST");
OutputStream dout = hc.getOutputStream();
////1.先写文字形式的post流
//头
String boundary = BOUNDARY;
//中
StringBuffer resSB = new
StringBuffer("\r\n");
//尾
String endBoundary = "\r\n--" + boundary +
"--\r\n";
//strParams 1:key 2:value
if(strParams != null){
for(String[] parsm : strParams){
String key = parsm[0];
String value = parsm[1];
resSB.append("Content-Disposition: form-data;
name="").append(key).append(""\r\n").append("\r\n").append(value).append("\r\n").append("--").append(boundary).append("\r\n");
}
}
String boundaryMessage = resSB.toString();
//写出流
dout.write( ("--"+boundary+boundaryMessage).getBytes("utf-8")
);
//2.再写文件开式的post流
//fileParams 1:fileField, 2.fileName, 3.fileType,
4.filePath
resSB = new StringBuffer();
if(fileParams != null){
for(int i=0, num=fileParams.size(); i<num;
i++){
String[] parsm = fileParams.get(i);
String fileField = parsm[0];
String fileName = parsm[1];
String fileType = parsm[2];
String filePath = parsm[3];
resSB.append("Content-Disposition: form-data;
name="").append(fileField).append("";
filename="").append(
fileName).append(""\r\n").append("Content-Type:
").append(fileType).append("\r\n\r\n");
dout.write( resSB.toString().getBytes("utf-8")
);
//开始写文件
File file = new File(filePath);
DataInputStream in = new DataInputStream(new
FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024 * 5];
while ((bytes = in.read(bufferOut)) != -1)
{
dout.write(bufferOut, 0, bytes);
}
if(i<num-1){
dout.write( endBoundary.getBytes("utf-8")
);
}
in.close();
}
}
//3.最后写结尾
dout.write( endBoundary.getBytes("utf-8")
);
dout.close();
int ch;
is =
hc.getInputStream();
bos = new ByteArrayOutputStream();
while ((ch = is.read()) != -1) {
bos.write(ch);
}
res = bos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (bos != null)
bos.close();
if (is != null)
is.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
return res;
}
}
httpurlconnection模拟post提交form表单(普通文本和上传文件) (的更多相关文章
- Django框架 之 Form表单和Ajax上传文件
Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...
- $_FILES参数详解及简单<form>表单无刷新上传文件
$_FILES:经由 HTTP POST 文件上传而提交至脚本的变量,类似于旧数组$HTTP_POST_FILES 数组(依然有效,但反对使用)详细信息可参阅 POST方法上传 $_FILES数组内容 ...
- C# 模拟提交 Form表单的数据
用 HttpWebRequest Post方法模拟提交Form表单数据时,需要设置 ContentType 为 "application/x-www-form-urlencoded" ...
- ajax提交form表单
1. ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单. 2. from视图部分 <form id="loginF ...
- Jquery通过Ajax方式来提交Form表单
今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...
- ajax提交form表单资料详细汇总
一.ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单.通过在后台与服务器进行少量数据交换,ajax 可以使网页实现异步更新.这意味 ...
- 导出excel用ajax不行,提交form表单可以
导出excel用ajax不行,提交form表单可以. 一直用ajax找原因,网页不出现下载提示框 写了 response.setContentType("application/binary ...
- 提交form表单不刷新页面案列
提交form表单不刷新页面其实很简单的,这里拿上传图片来举列,大家有什么其它的方法也欢迎留言告知与我 <form action="" method="post&qu ...
- jquery实现ajax提交form表单的方法总结
本篇文章主要是对jquery实现ajax提交form表单的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一: function AddHandlingFeeToRefund( ...
随机推荐
- [转] Makefile 基础 (7) —— Makefile 中 make 的运行
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...
- linux安装websocketd服务
1.下载 wget https://github.com/joewalnes/websocketd/releases/download/v0.3.0/websocketd-0.3.0-linux_am ...
- 【前端学习笔记】2015-09-06 ~~~~ setAttribute()、slice()
所遇记录: 1.setAttribute("属性",value),相同的还有addAttribute("属性名",value),getAttribute(“属性 ...
- hdu 3685 多边形重心+凸包
Rotational Painting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- phthon入门介绍
1.基本的python语法 2.python爬虫 3.基本的数据分析 4.做网站 5.做机器学习 1.python简介: Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节.类似于 ...
- javap的基本用法
参考:http://www.cnblogs.com/beautiful-code/p/6424977.html javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码.通过它,我们 ...
- HYSBZ 1026: windy数(数位DP)
类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.问[A,B]之间windy数的个数.(1 <= A <= B <= 2000000000 ) 思路 ...
- LeetCode OJ--Rotate Image
http://oj.leetcode.com/problems/rotate-image/ 将矩阵顺时针旋转90度.要求为原地算法. 注意对输入的测试,矩阵为空,长度为1,为2时…… #include ...
- Java 界面编程【02】事件注册
聪明出于勤奋,天才在于积累.——华罗庚 对上次的三个问题的个人理解: 1) 程序首先是从main函数开始执行的,假设main 函数不是 static ,就要先实例化这个类,然后调用 main 方法,这 ...
- IntelliJ IDEA出现:java: Compilation failed: internal java compiler error的问题解决
这两处地方要同时修改成一样的. 参考: http://blog.csdn.net/u011275152/article/details/45242201