这个文章主要是熟悉Upload数据时的数据格式,许多的upload组件看上去很神秘,其实内部并不复杂。
一、我们先来看看当表单
类型为multipart/form-data
<form action="/admin/blogs" enctype="multipart/form-data" id="blog_form" method="post">
// 标题
<input class="text required min-length-3 bad-words" id="blog_title" maxlength="50"
name="blog[title]" size="45" style="width:400px;" type="text" />
// 内容
<textarea class="validate-richeditor bad-words min-length-5" cols="40" id="editor_body"
name="blog[body]" rows="20" style="width: 510px; height: 350px;"></textarea>
</form>
二、拿到的一个数据
- ...
- Content-Type: multipart/form-data; boundary=---------------------------29510474520649
- Content-Length: 4281
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[blog_type]"
- 1
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[title]"
- 测试博客标题
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[category_id]"
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[user_tags]"
- -----------------------------29510474520649
- Content-Disposition: form-data; name="auto_save_id"
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[bbcode]"
- true
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[body]"
- 测试博客的内容,
- 附件为java2000.net的LOGO
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[diggable]"
- 0
- -----------------------------29510474520649
- Content-Disposition: form-data; name="blog[forum_id]"
- -----------------------------29510474520649
- Content-Disposition: form-data; name=""; filename=""
- Content-Type: application/octet-stream
- -----------------------------29510474520649
- Content-Disposition: form-data; name="attachments[][remark]"
- java2000.net的LOGO
- -----------------------------29510474520649
- Content-Disposition: form-data; name="attachments[][uploaded_data]"; filename="www.java2000.net.gif"
- Content-Type: image/gif
- GIF89a。。。。。
- -----------------------------29510474520649
- Content-Disposition: form-data; name="commit"
- 提交
- -----------------------------29510474520649--
解释一下,其中的
Content-Type: multipart/form-data; boundary=---------------------------29510474520649
是关键,前面代表提交数据的类型,后面是分割边界的标志boundary
后面的数据,使用 -- 加上 boundary 作为分割标志
最后一行数据,使用 -- 加上boundary 再加上 -- 作为结尾标志
三,根据数据我们配置了一个提交数据的模板
- {BOUNDARY}{BR}Content-Disposition: form-data; name="blog[blog_type]"{BR}{BR}1{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[title]"{BR}{BR}{TITLE}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[category_id]"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[user_tags]"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="auto_save_id"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[bbcode]"{BR}{BR}true{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[body]"{BR}{BR}{CONTENT}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[forum_id]"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="commit"{BR}{BR}{SUBMIT}{BR}{BOUNDARY}--{BR}
其中的
{BOUNDARY} 是分割标志,
{BR}是换行
{TITLE}是标题
{CONTENT}是内容
{SUBMIT}是提交的按钮标签
四、用程序提交数据
对于cookie的操作和获取我就不多说了,请自行参考前一个文章。
1 这里只贴出来一个简单的配置结果
- host=zhaoxq-java2000-net.iteye.com
- charset=UTF-8
- cookie=
- post=http://zhaoxq-java2000-net.iteye.com/admin/blogs/new
- action=http://zhaoxq-java2000-net.iteye.com/admin/blogs
- message={BOUNDARY}{BR}Content-Disposition: form-data; name="blog[blog_type]"{BR}{BR}1{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[title]"{BR}{BR}{TITLE}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[category_id]"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[user_tags]"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="auto_save_id"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[bbcode]"{BR}{BR}true{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[body]"{BR}{BR}{CONTENT}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="blog[forum_id]"{BR}{BR}{BR}{BOUNDARY}{BR}Content-Disposition: form-data; name="commit"{BR}{BR}{SUBMIT}{BR}{BOUNDARY}--{BR}
2 发布的程序
- package net.java2000.blogsender.javaeye;
- import java.io.IOException;
- import java.util.Properties;
- import net.java2000.blogsender.Sender;
- import net.java2000.blogsender.baidu.BaiduSender;
- import net.java2000.blogsender.util.PostUtil;
- public class JavaEyeSender implements Sender {
- private String host;
- private String charset;
- private String post;
- private String action;
- private String cookie;
- private String message;
- private String boundary;
- public boolean send(String title, String content) {
- return PostUtil.postMultiPart(host, charset, action, post, cookie, message, boundary, title, content);
- }
- public JavaEyeSender() {
- Properties p = new Properties();
- try {
- p.load(BaiduSender.class.getResourceAsStream("javaeye.properties"));
- host = p.getProperty("host");
- charset = p.getProperty("charset");
- post = p.getProperty("post");
- action = p.getProperty("action");
- cookie = p.getProperty("cookie");
- message = p.getProperty("message");
- boundary = "---------------------------" + System.currentTimeMillis();
- String boundary1 = "--" + boundary;
- message = message.replace("{BR}", "\r\n");
- message = message.replace("{BOUNDARY}", boundary1);
- message = message.replace("{SUBMIT}", "提交");
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- public static void main(String[] args) {
- Sender sender = new JavaEyeSender();
- sender.send("测试测试", "测试[b]测试测[/b]试\r\n121212\r\n32324324\r\n65465465465\r\n");
- }
- }
3 发布数据的辅助类
- public static boolean postMultiPart(String host, String charset, String postURL, String referer, String cookies, String message, String boundary, String title, String content) {
- try {
- URL url = new URL(postURL);
- HttpURLConnection con = (HttpURLConnection) url.openConnection();
- con.setDoOutput(true);
- con.setDoInput(true);
- con.setRequestMethod("POST");
- con.addRequestProperty("Host", host);
- con.addRequestProperty("Referer", referer);
- con.addRequestProperty("Cookie", cookies.trim());
- con.addRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
- message = message.replace("{TITLE}", title);
- message = message.replace("{CONTENT}", content);
- con.addRequestProperty("Content-Length", Integer.toString(message.getBytes(charset).length));
- OutputStream os = con.getOutputStream();
- os.write(message.getBytes(charset));
- os.flush();
- BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), charset));
- String line;
- while ((line = reader.readLine()) != null) {
- System.out.println(line);
-
- }
- os.close();
- reader.close();
- return true;
- } catch (Exception ex) {
- ex.printStackTrace();
- return false;
- }
- }
五、总结:
我简单说明了提交upload数据的格式已经实现的一个简单方法。有兴趣的人可以自行看看html的协议内容,里面讲解的很清楚。你会对upload不在神秘。
顺便说一句,对于二进制数据的提交,大部分会进行Base64或者QP的编码,这样整个数据里面将只有ASCII码,而不会出现怪字符。不过有些客户端,不会这么做。
这个数据格式与我们邮件的内部格式非常类似。
原文地址:http://www.java2000.net/p8849
<script type="text/javascript">
</script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
分享到:
相关推荐
建筑工地扬尘治理与文明施工检查表.docx
基于java的个性化旅游攻略定制系统设计与实现.docx
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 导弹追击模型的建立与求解 共6页.pdf
基础课程辅助教学-JAVA-基于springBoot程序设计基础课程辅助教学系统设计与实现
适用人群:大学生 自学者 使用场景:大学生毕设 自学者练手项目 学习与交流 其它说明:部分资源来源网络及开源社区、仅供参考与学习、不可商用、若有侵权请联系删除! 内容概要:用springmvc实现的校园选课管理系统
java课程期末考试
C++ Vigenère 密码(解密代码)
工程研究中心申报基本情况一览表.docx
Vigenère 密码(加密代码)
密码学AES算法源代码,密码学实验
基于java的百货中心供应链管理系统设计与实现.docx
环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目均可完美运行
【资源说明】 大数据毕业设计 基于Python+Spark机器学习天气预测系统详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
购物系统 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程
BIM 人才培养的框架和方法 相关的标准
源项目文件
ActiveMQ消息中间件的测试案例
内容概要:本文全面解析了汽车电动化、智能化背景下,车规芯片SoC的重要性和发展趋势。首先概述了汽车行业发展三大趋势——新能源车市场崛起、智能化引领新潮流、商业模式及价值链重构。随后详细介绍了车规芯片SoC的应用领域,包括主控芯片、功率芯片、CMOS芯片、射频接收器、传感器、存储芯片及汽车面板,并阐述了它们的作用和技术需求。文章接着讨论了电子电气架构的演进路径,从分布式向集中式的演进对汽车芯片供应链带来的影响。最后探讨了汽车SoC的技术特征、应用领域、未来发展方向及其面临的挑战。 适合人群:汽车芯片设计师、汽车制造商、科研机构及相关行业的专业人士。 使用场景及目标:理解和掌握汽车芯片尤其是SoC在智能电动汽车中的应用及未来发展,帮助相关从业者做出更好的技术和商业决策。 其他说明:随着智能电动汽车市场的快速成长,车规芯片SoC作为核心技术将面临前所未有的机遇和挑战。
用于控制 Broadlink RM2/3 (Pro) 遥控器、A1 传感器平台和 SP2/3 智能插头的 Python 模块python-broadlink用于本地控制 Broadlink 设备的 Python 模块和 CLI。支持以下设备通用遥控器RM home、RM mini 3、RM plus、RM pro、RM pro+、RM4 mini、RM4 pro、RM4C mini、RM4S、RM4 TV mate智能插头SP mini、SP mini 3、SP mini+、SP1、SP2、SP2-BR、SP2-CL、SP2-IN、SP2-UK、SP3、SP3-EU、SP3S-EU、SP3S-US、SP4L-AU、SP4L-EU、SP4L-UK、SP4M、SP4M-US、Ankuoo NEO、Ankuoo NEO PRO、Efergy Ego、BG AHC/U-01开关MCB1、SC1、SCB1E、SCB2出口BG 800, BG 900电源板MP1-1K3S2U、MP1-1K4S、MP2环境传感器A1报警套件S1C、S2KIT灯泡LB1、LB26 R1、LB2
这是一份关于五个城市的PM2.5监测数据文件,以CSV格式存储。数据涵盖了广州、北京、沈阳等地的空气质量情况,旨在帮助研究人员和数据分析人员更好地理解城市空气污染状况。 使用人群 适合对环境科学、大气污染研究感兴趣的科研工作者、学生及环保组织成员使用。 数据内容 包含五个主要城市的PM2.5浓度数据 时间跨度较长,覆盖多年数据 CSV格式方便导入各种数据分析软件进行进一步处理和分析