这个文章主要是熟悉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>
分享到:
相关推荐
本文将详细讲解如何使用Java实现邮件自动发送,并基于提供的两个源码文件`mailFor163`和`mailForSina`进行解析。 首先,Java Mail API是Java发送邮件的核心库,它提供了丰富的接口和类来处理邮件协议,如SMTP(简单...
本文将深入分析一个Java程序示例——`Mail.java`,它通过Socket编程实现邮件发送功能,并支持添加附件。 #### 二、类设计与功能概述 `Mail.java` 类的设计遵循了面向对象的原则,提供了发送邮件以及添加附件的方法...
Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java...
163邮箱支持IMAP协议,使得我们可以编写程序来自动化处理邮件。要实现这一功能,可以使用Python编程语言,结合第三方库如`imaplib`和`email`。 1. **设置环境**: 在Python环境中,首先确保已经安装了`imaplib`库...
5. **定时任务**:为了让系统开机自动运行并定时发送邮件,可以使用操作系统级别的定时任务服务,如Windows的任务计划程序,或者在代码中集成`cron`(Linux/Unix)或`ScheduledExecutorService`(Java)来实现定时...
3. 发件人服务器验证用户身份后,接受邮件并尝试将其发送到收件人的邮件服务器。 4. 收件人的邮件服务器接收到邮件后存储在服务器上。 POP3和IMAP4的区别在于: - POP3通常会下载所有邮件到本地设备,并可能从...
同样,如果能正常运行Java程序,表明`CLASSPATH`也配置无误。 总之,配置Java 1.6.0环境变量是Java开发的基础步骤,理解每个变量的作用和配置方法有助于提升开发效率。在实践中不断探索和熟悉这些设置,对于深入...
附件中的"学籍管理系统JAVA课程设计.zip"可能包含了这个算法的具体实现,包括源代码、Demo应用程序和人民日报语料库。开发者可以参考这些资源来理解算法的运作方式,甚至将其应用于自己的项目。需要注意的是,这样的...
这个"java_email"项目可能就是一个简单的Java程序示例,用于演示如何通过代码发送邮件,并且在"testEmail"这个子文件中包含了相关的测试代码或配置。 JavaMail API是Java平台上的一个开源库,它提供了一组接口和类...
综上所述,这个示例展示了如何在Java程序中通过多线程处理读取HTML文件,并使用JavaMail API将内容作为HTML邮件发送出去。在实际开发中,还需要考虑异常处理、错误报告以及更复杂的邮件配置,如附件、抄送、密送等。
描述中提到的“博文链接:https://cainiaoyu.iteye.com/blog/2029211”可能是一个博客文章,提供了关于这个附件的详细背景或使用方法。然而,由于没有实际的链接内容可供参考,我们只能基于标签和文件名来推测可能...
JAF使得Java应用程序能够自动处理未知的数据类型,特别是当这些数据类型通过网络传输时,如电子邮件中的附件。JAF定义了一套规则来注册和识别MIME类型,这使得程序可以处理各种不同格式的数据,而无需事先了解这些...
1. 发送服务器:当用户通过Java程序或其他方式撰写邮件时,这些邮件会通过SMTP协议发送到发送服务器。发送服务器验证发件人的身份,然后尝试将邮件转发到收件人的邮件服务器。 2. 接收服务器:收件人的邮件服务器...
在Java开发中,经常会遇到文件路径包含空格、"Plus"符号("+")以及中文字符的情况。...通过这些方法的应用,可以有效地解决在Java程序中读取包含特殊字符文件路径时遇到的各种问题,确保程序的稳定运行。
这样做的好处是,在中间这个过程当中,你可以加一些另外的程序,这样可以实现整个系统的自动化。 当然,即使你不加,也没有关系。 那么我们通常用eclipse来编译这些程序(因为是免费的,不像微软那些程序,很...
- 在Java中,静态数组在没有显式初始化的情况下会被自动初始化为默认值,对于整型数组,默认值为0。 - 因此,这段代码的输出结果为0。 ### 8. 二维数组的定义 - **问题描述**:题目考查了不同二维数组的定义方式...
- **JDK (Java Development Kit)**:Java开发工具包,包含了编译、运行Java程序所需的所有工具。 - **IDE (Integrated Development Environment)**:集成开发环境,是用于提供全面设施来创建、调试和维护应用程序的...