`
逆风的香1314
  • 浏览: 1432197 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Java程序自动发博客的尝试-带附件

阅读更多
 这个文章主要是熟悉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>

二、拿到的一个数据
  1. ...
  2. Content-Type: multipart/form-data; boundary=---------------------------29510474520649
  3. Content-Length: 4281
  4. -----------------------------29510474520649
  5. Content-Disposition: form-data; name="blog[blog_type]"
  6. 1
  7. -----------------------------29510474520649
  8. Content-Disposition: form-data; name="blog[title]"
  9. 测试博客标题
  10. -----------------------------29510474520649
  11. Content-Disposition: form-data; name="blog[category_id]"
  12. -----------------------------29510474520649
  13. Content-Disposition: form-data; name="blog[user_tags]"
  14. -----------------------------29510474520649
  15. Content-Disposition: form-data; name="auto_save_id"
  16. -----------------------------29510474520649
  17. Content-Disposition: form-data; name="blog[bbcode]"
  18. true
  19. -----------------------------29510474520649
  20. Content-Disposition: form-data; name="blog[body]"
  21. 测试博客的内容,
  22. 附件为java2000.net的LOGO
  23. -----------------------------29510474520649
  24. Content-Disposition: form-data; name="blog[diggable]"
  25. 0
  26. -----------------------------29510474520649
  27. Content-Disposition: form-data; name="blog[forum_id]"
  28. -----------------------------29510474520649
  29. Content-Disposition: form-data; name=""filename=""
  30. Content-Type: application/octet-stream
  31. -----------------------------29510474520649
  32. Content-Disposition: form-data; name="attachments[][remark]"
  33. java2000.net的LOGO
  34. -----------------------------29510474520649
  35. Content-Disposition: form-data; name="attachments[][uploaded_data]"filename="www.java2000.net.gif"
  36. Content-Type: image/gif
  37. GIF89a。。。。。
  38. -----------------------------29510474520649
  39. Content-Disposition: form-data; name="commit"
  40. 提交
  41. -----------------------------29510474520649--

解释一下,其中的
Content-Type: multipart/form-data; boundary=---------------------------29510474520649
是关键,前面代表提交数据的类型,后面是分割边界的标志boundary
后面的数据,使用 -- 加上 boundary 作为分割标志
最后一行数据,使用 -- 加上boundary 再加上 -- 作为结尾标志


三,根据数据我们配置了一个提交数据的模板

  1. {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 这里只贴出来一个简单的配置结果
  1. host=zhaoxq-java2000-net.iteye.com
  2. charset=UTF-8
  3. cookie=   
  4. post=http://zhaoxq-java2000-net.iteye.com/admin/blogs/new
  5. action=http://zhaoxq-java2000-net.iteye.com/admin/blogs
  6. 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 发布的程序
  1. package net.java2000.blogsender.javaeye;
  2. import java.io.IOException;
  3. import java.util.Properties;
  4. import net.java2000.blogsender.Sender;
  5. import net.java2000.blogsender.baidu.BaiduSender;
  6. import net.java2000.blogsender.util.PostUtil;
  7. public class JavaEyeSender implements Sender {
  8.   private String host;
  9.   private String charset;
  10.   private String post;
  11.   private String action;
  12.   private String cookie;
  13.   private String message;
  14.   private String boundary;
  15.   public boolean send(String title, String content) {
  16.     return PostUtil.postMultiPart(host, charset, action, post, cookie, message, boundary, title, content);
  17.   }
  18.   public JavaEyeSender() {
  19.     Properties p = new Properties();
  20.     try {
  21.       p.load(BaiduSender.class.getResourceAsStream("javaeye.properties"));
  22.       host = p.getProperty("host");
  23.       charset = p.getProperty("charset");
  24.       post = p.getProperty("post");
  25.       action = p.getProperty("action");
  26.       cookie = p.getProperty("cookie");
  27.       message = p.getProperty("message");
  28.       boundary = "---------------------------" + System.currentTimeMillis();
  29.       String boundary1 = "--" + boundary;
  30.       message = message.replace("{BR}""\r\n");
  31.       message = message.replace("{BOUNDARY}", boundary1);
  32.       message = message.replace("{SUBMIT}""提交");
  33.     } catch (IOException e) {
  34.       e.printStackTrace();
  35.     }
  36.   }
  37.   public static void main(String[] args) {
  38.     Sender sender = new JavaEyeSender();
  39.     sender.send("测试测试""测试[b]测试测[/b]试\r\n121212\r\n32324324\r\n65465465465\r\n");
  40.   }
  41. }

3 发布数据的辅助类

  1.   public static boolean postMultiPart(String host, String charset, String postURL, String referer, String cookies, String message, String boundary, String title, String content) {
  2.     try {
  3.       URL url = new URL(postURL);
  4.       HttpURLConnection con = (HttpURLConnection) url.openConnection();
  5.       con.setDoOutput(true); // POST方式
  6.       con.setDoInput(true);
  7.       con.setRequestMethod("POST");
  8.       con.addRequestProperty("Host", host);
  9.       con.addRequestProperty("Referer", referer);
  10.       con.addRequestProperty("Cookie", cookies.trim());
  11.       con.addRequestProperty("Content-Type""multipart/form-data; boundary=" + boundary);
  12.       message = message.replace("{TITLE}", title);
  13.       message = message.replace("{CONTENT}", content);
  14.       con.addRequestProperty("Content-Length", Integer.toString(message.getBytes(charset).length));
  15.       OutputStream os = con.getOutputStream(); // 输出流,写数据
  16.       os.write(message.getBytes(charset));
  17.       os.flush();
  18.       BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), charset)); // 读取结果
  19.       String line;
  20.       while ((line = reader.readLine()) != null) {
  21.         System.out.println(line);
  22.         // break;
  23.       }
  24.       os.close();
  25.       reader.close();
  26.       return true;
  27.     } catch (Exception ex) {
  28.       ex.printStackTrace();
  29.       return false;
  30.     }
  31.   }



五、总结:
  我简单说明了提交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实现邮件自动发送

    本文将详细讲解如何使用Java实现邮件自动发送,并基于提供的两个源码文件`mailFor163`和`mailForSina`进行解析。 首先,Java Mail API是Java发送邮件的核心库,它提供了丰富的接口和类来处理邮件协议,如SMTP(简单...

    发送邮件及邮件附件java代码实例

    本文将深入分析一个Java程序示例——`Mail.java`,它通过Socket编程实现邮件发送功能,并支持添加附件。 #### 二、类设计与功能概述 `Mail.java` 类的设计遵循了面向对象的原则,提供了发送邮件以及添加附件的方法...

    JAVA上百实例源码以及开源项目源代码

    Java目录监视器源程序 9个目标文件 内容索引:JAVA源码,综合应用,目录监视 用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java...

    获取163邮箱的邮件 并下载附件

    163邮箱支持IMAP协议,使得我们可以编写程序来自动化处理邮件。要实现这一功能,可以使用Python编程语言,结合第三方库如`imaplib`和`email`。 1. **设置环境**: 在Python环境中,首先确保已经安装了`imaplib`库...

    自动发邮件系统

    5. **定时任务**:为了让系统开机自动运行并定时发送邮件,可以使用操作系统级别的定时任务服务,如Windows的任务计划程序,或者在代码中集成`cron`(Linux/Unix)或`ScheduledExecutorService`(Java)来实现定时...

    电子邮件发送和接收程序.rar 电子邮件发送和接收程序.rar

    3. 发件人服务器验证用户身份后,接受邮件并尝试将其发送到收件人的邮件服务器。 4. 收件人的邮件服务器接收到邮件后存储在服务器上。 POP3和IMAP4的区别在于: - POP3通常会下载所有邮件到本地设备,并可能从...

    Java1.6.0环境变量的配置[整理].pdf

    同样,如果能正常运行Java程序,表明`CLASSPATH`也配置无误。 总之,配置Java 1.6.0环境变量是Java开发的基础步骤,理解每个变量的作用和配置方法有助于提升开发效率。在实践中不断探索和熟悉这些设置,对于深入...

    基于词典的简单分词算法(Java)java人力资源管理系统学籍管理系统JAVA课程设计

    附件中的"学籍管理系统JAVA课程设计.zip"可能包含了这个算法的具体实现,包括源代码、Demo应用程序和人民日报语料库。开发者可以参考这些资源来理解算法的运作方式,甚至将其应用于自己的项目。需要注意的是,这样的...

    java_email

    这个"java_email"项目可能就是一个简单的Java程序示例,用于演示如何通过代码发送邮件,并且在"testEmail"这个子文件中包含了相关的测试代码或配置。 JavaMail API是Java平台上的一个开源库,它提供了一组接口和类...

    开线程 读取html内容 发送java mail

    综上所述,这个示例展示了如何在Java程序中通过多线程处理读取HTML文件,并使用JavaMail API将内容作为HTML邮件发送出去。在实际开发中,还需要考虑异常处理、错误报告以及更复杂的邮件配置,如附件、抄送、密送等。

    工作附件

    描述中提到的“博文链接:https://cainiaoyu.iteye.com/blog/2029211”可能是一个博客文章,提供了关于这个附件的详细背景或使用方法。然而,由于没有实际的链接内容可供参考,我们只能基于标签和文件名来推测可能...

    activation和mail双jar

    JAF使得Java应用程序能够自动处理未知的数据类型,特别是当这些数据类型通过网络传输时,如电子邮件中的附件。JAF定义了一套规则来注册和识别MIME类型,这使得程序可以处理各种不同格式的数据,而无需事先了解这些...

    04_传智播客张孝祥java邮件开发_邮件协议总结与邮件服务器的工作原理

    1. 发送服务器:当用户通过Java程序或其他方式撰写邮件时,这些邮件会通过SMTP协议发送到发送服务器。发送服务器验证发件人的身份,然后尝试将邮件转发到收件人的邮件服务器。 2. 接收服务器:收件人的邮件服务器...

    java 读取文件路径空格、"+"和中文的处理方法

    在Java开发中,经常会遇到文件路径包含空格、"Plus"符号("+")以及中文字符的情况。...通过这些方法的应用,可以有效地解决在Java程序中读取包含特殊字符文件路径时遇到的各种问题,确保程序的稳定运行。

    Simulink生成独立的exe文件的一些方法-EclipseStepByStep_v2_final.ppt

    这样做的好处是,在中间这个过程当中,你可以加一些另外的程序,这样可以实现整个系统的自动化。 当然,即使你不加,也没有关系。 那么我们通常用eclipse来编译这些程序(因为是免费的,不像微软那些程序,很...

    2021-2022计算机二级等级考试试题及答案No.16965.docx

    - 在Java中,静态数组在没有显式初始化的情况下会被自动初始化为默认值,对于整型数组,默认值为0。 - 因此,这段代码的输出结果为0。 ### 8. 二维数组的定义 - **问题描述**:题目考查了不同二维数组的定义方式...

    计算机英语

    - **JDK (Java Development Kit)**:Java开发工具包,包含了编译、运行Java程序所需的所有工具。 - **IDE (Integrated Development Environment)**:集成开发环境,是用于提供全面设施来创建、调试和维护应用程序的...

Global site tag (gtag.js) - Google Analytics