惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Cloudflare Blog
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
博客园 - 司徒正美
V
Visual Studio Blog
G
Google Developers Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
aimingoo的专栏
aimingoo的专栏
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
博客园 - 聂微东
S
SegmentFault 最新的问题
T
The Blog of Author Tim Ferriss
D
Docker
Vercel News
Vercel News
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
爱范儿
爱范儿
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏

博客园 - 黑月

百度二面,惨败而归 百度贴吧的验证图片原理研究 荷兰银行、汇丰银行,开始招聘了 路透北京软件研发中心2008年见习软件工程师 找了一些智力题,有兴趣的做做看:) 网站中毒 qq书签服务 转载:prototype的Ajax介绍 引用:web发展10大趋势. 转载:-水木【Adobe】 首次校园招聘,大家进来谈谈吧!对他了解有多少? 算法求解:MxN迷宫问题 一段提取网站信息的代码(c#) 自动快速注册sohu club用户的htm (reg.htm) 摩根士丹利 Morgan Stanley 2008校园招聘已经正式开 黑月:常用的一个计算时间复杂度的公式! 专注于c# 好多年了,找工作发现没什么合适的公司? 2008各大企业招聘开始了-博客园的 cnblogser们准备的怎样了? 做了一个找工作的网站, 希望对今年2008找工作的同学有帮助 最近做了一个程序。可以用来变换代理不停的刷新某个网站。不知道是否可以用来广告作弊:)
C#模拟提交表单 post-带附件的表单
黑月 · 2007-11-16 · via 博客园 - 黑月

  如果要在客户端向服务器上传文件,我们就必须模拟一个POST multipart/form-data类型的请求,Content-Type必须是multipart/form-data。

  以multipart/form-data编码的POST请求格式与application/x-www-form-urlencoded完全不同,multipart/form-data需要首先在HTTP请求头设置一个分隔符,例如ABCD:

  我们模拟的提交要设定 content-type不同于非含附件的post时候的content-type,这里需要: ("Content-Type", "multipart/form-data; boundary=ABCD");

  然后,将每个字段用“--分隔符”分隔,最后一个“--分隔符--”表示结束。例如,要上传一个title字段"Today"和一个文件C:\1.txt,HTTP正文如下:

--ABCD

Content-Disposition: form-data; name="title"

\r\n

Today

--ABCD

Content-Disposition: form-data; name="1.txt"; filename="C:\1.txt"

Content-Type: text/plain

\r\n

<这里是1.txt文件的内容>

--ABCD--

\r\n

  请注意,每一行都必须以\r\n结束,包括最后一行。

如果用Sniffer程序检测IE发送的POST请求,可以发现IE的分隔符类似于——7d4a6d158c9,这是IE产生的一个随机数,目的是防止上传文件中出现分隔符导致服务器无法正确识别文件起始位置。我们可以写一个固定的分隔符,只要足够复杂即可。

下面是一段java的post 带附件的模拟发送程序段:

  发送文件的POST代码如下:

String[] props = ... // 字段名
String[] values = ... // 字段值
byte[] file = ... // 文件内容
String BOUNDARY = "---------------------------7d4a6d158c9"; // 分隔符
StringBuffer sb = new StringBuffer();// 发送每个字段
:for(int i=0; i sb = sb.append("--");
sb = sb.append(BOUNDARY);
sb = sb.append("\r\n");
sb = sb.append("Content-Disposition: form-data; name=\""+ props[i] + "\"\r\n\r\n");
sb = sb.append(URLEncoder.encode(values[i]));
sb = sb.append("\r\n");
}// 发送文件:sb = sb.append("--");
sb = sb.append(BOUNDARY);
sb = sb.append("\r\n");
sb = sb.append("Content-Disposition: form-data; name=\"1\"; filename=\"1.txt\"\r\n");
sb = sb.append("Content-Type: application/octet-stream\r\n\r\n");
byte[] data = sb.toString().getBytes();
byte[] end_data = ("\r\n--" + BOUNDARY + "--\r\n").getBytes();// 设置HTTP头:
hc.setRequestProperty("Content-Type", MULTIPART_FORM_DATA + ";
boundary=" + BOUNDARY);
hc.setRequestProperty("Content-Length", String.valueOf(data.length + file.length + end_data.length));
// 输出:output = hc.openOutputStream();output.write(data);output.write(file);output.write(end_data);
// 读取服务器响应:
// TODO...