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表单(普通文本和上传文件) (的更多相关文章

  1. Django框架 之 Form表单和Ajax上传文件

    Django框架 之 Form表单和Ajax上传文件 浏览目录 Form表单上传文件 Ajax上传文件 伪造Ajax上传文件 Form表单上传文件 html 1 2 3 4 5 6 7 <h3& ...

  2. $_FILES参数详解及简单<form>表单无刷新上传文件

    $_FILES:经由 HTTP POST 文件上传而提交至脚本的变量,类似于旧数组$HTTP_POST_FILES 数组(依然有效,但反对使用)详细信息可参阅 POST方法上传 $_FILES数组内容 ...

  3. C# 模拟提交 Form表单的数据

    用 HttpWebRequest Post方法模拟提交Form表单数据时,需要设置 ContentType 为 "application/x-www-form-urlencoded" ...

  4. ajax提交form表单

    1. ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单. 2. from视图部分 <form id="loginF ...

  5. Jquery通过Ajax方式来提交Form表单

    今天刚好看到Jquery的ajax提交数据到服务器的方法,原文是: 保存数据到服务器,成功时显示信息. jQuery 代码: $.ajax({ type: "POST", url: ...

  6. ajax提交form表单资料详细汇总

    一.ajax提交form表单和不同的form表单的提交主要区别在于,ajax提交表单是异步提交的,而普通的是同步提交的表单.通过在后台与服务器进行少量数据交换,ajax 可以使网页实现异步更新.这意味 ...

  7. 导出excel用ajax不行,提交form表单可以

    导出excel用ajax不行,提交form表单可以. 一直用ajax找原因,网页不出现下载提示框 写了 response.setContentType("application/binary ...

  8. 提交form表单不刷新页面案列

    提交form表单不刷新页面其实很简单的,这里拿上传图片来举列,大家有什么其它的方法也欢迎留言告知与我 <form action="" method="post&qu ...

  9. jquery实现ajax提交form表单的方法总结

    本篇文章主要是对jquery实现ajax提交form表单的方法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 方法一:  function AddHandlingFeeToRefund( ...

随机推荐

  1. hdu 4602 递推关系矩阵快速幂模

    Partition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. Bzoj2038 小Z的袜子(hose)

    Time Limit: 20000MS   Memory Limit: 265216KB   64bit IO Format: %lld & %llu Description 作为一个生活散漫 ...

  3. poj 1066 Treasure Hunt 线段相交

    题目链接 题目描述 一个正方形房间被分成若干个小室,宝藏在其中某一点.现可炸开任意一堵墙壁的中点位置.问至少要炸开多少堵墙才能从外面到达宝藏所在地. 思路 (很巧妙,没想到) 直接枚举墙壁与正方形外壁 ...

  4. 转 C++中不能声明为虚函数的有哪些函数

    传送门 C++中不能声明为虚函数的有哪些函数 常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数 ...

  5. ROS学习网址【原创】

    ROS学习网址 http://www.ros.org/ http://www.ros.org/news/book/ http://wiki.ros.org/ http://blog.exbot.net ...

  6. CI安全

    URI安全,CodeIgniter 严格限制 URI 中所能包含的字符,以此帮助你设计的程序减少被恶意数据入侵的可能.URI 一般只包含下列内容: 字母和数字(Alpha-numeric text) ...

  7. AC日记——[ZJOI2009]假期的宿舍 cogs 1333

    1333. [ZJOI2009] 假期的宿舍 ★★☆   输入文件:zjoi09holiday.in   输出文件:zjoi09holiday.out   简单对比时间限制:1 s   内存限制:25 ...

  8. 作为程序员,再也不想和PM干架了

    上周,又看见有程序和PM(产品经理)吵了起来,大致是因为晚上就要上线了,下午的时候PM来说要改点需求,但程序不愿意.兴许是天气热了,大家都很烦躁,于是一言不合就发飙了,最终还是程序老大介入才解决了问题 ...

  9. 洛谷—— P1873 砍树

    https://www.luogu.org/problemnew/show/P1873 题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以 ...

  10. [UOJ#24]【IOI2014】Rail

    #24. [IOI2014]Rail 台湾有一个连接着岛的东.西两岸的庞大的铁路线.这个铁路线包含有 mm 个区段.这些相连的区段以数字 0,…,m−10,…,m−1 为编号,且编号由西端开始.每一个 ...