Java模拟form表单上传

查看form表单提交的http请求为

  1. import java.io.*;
  2. import java.net.*;
  3.  
  4. public class FileUpload {
  5. /**
  6. * 模拟form表单的形式 ,上传文件 以输出流的形式把文件写入到url中,然后用输入流来获取url的响应
  7. * @param url 请求地址 form表单url地址
  8. * @param filePath 文件在服务器保存路径
  9. * @return String url的响应信息返回值
  10. * @throws IOException
  11. */
  12. public String send(String url, String filePath) throws IOException {
  13. String result = null;
  14. File file = new File(filePath);
  15. if (!file.exists() || !file.isFile()) {
  16. throw new IOException("文件不存在");
  17. }
  18. /**
  19. * 第一部分
  20. */
  21. URL urlObj = new URL(url);
  22. // 连接
  23. HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
  24. /**
  25. * 设置关键值
  26. */
  27. con.setRequestMethod("POST"); // 请求方式
  28. con.setDoInput(true);
  29. con.setDoOutput(true); // 当为post方式时,需要设置,因为要输入数据流
  30. con.setUseCaches(false); // post方式不能使用缓存
  31.  
  32. // 设置请求头信息
  33. con.setRequestProperty("Connection", "Keep-Alive");
  34. con.setRequestProperty("Charset", "UTF-8");
  35.  
  36. // 设置边界
  37. String BOUNDARY = "----------" + System.currentTimeMillis();
  38. con.setRequestProperty("Content-Type", "multipart/form-data; boundary="+ BOUNDARY);
  39.  
  40. // 请求正文信息
  41. // 需要提交的文件
  42. StringBuilder sb = new StringBuilder();
  43. sb.append("--"+BOUNDARY+"\r\n");
  44. sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n");
  45. sb.append("Content-Type:application/octet-stream\r\n\r\n");
  46. byte[] head = sb.toString().getBytes("utf-8");
  47. // 获得输出流
  48. OutputStream out = new DataOutputStream(con.getOutputStream());
  49. // 输出表头
  50. out.write(head);
  51. // 文件正文部分
  52. // 把文件已流文件的方式 推入到url中
  53. DataInputStream in = new DataInputStream(new FileInputStream(file));
  54. int bytes = 0;
  55. byte[] bufferOut = new byte[1024];
  56. while ((bytes = in.read(bufferOut)) != -1) {
  57. out.write(bufferOut, 0, bytes);
  58. }
  59. in.close();
  60.  
  61. // 需要提交的普通表单数据
  62. sb = new StringBuilder();
  63. sb.append("\r\n--"+BOUNDARY+"\r\n");
  64. sb.append("Content-Disposition: form-data;name=\"type\"\r\n\r\n");// 注意:在设置数据头 与 数据内容是 中间是隔了一行
  65. sb.append("1\r\n");
  66. sb.append("--"+BOUNDARY+"\r\n");
  67. sb.append("Content-Disposition: form-data;name=\"wxroleid\"\r\n\r\n");
  68. sb.append("201\r\n");
  69. head = sb.toString().getBytes("utf-8");
  70. out.write(head);
  71. // 结尾部分
  72. byte[] foot = ("--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
  73. out.write(foot);
  74. out.flush();
  75. out.close();
  76.  
  77. StringBuffer buffer = new StringBuffer();
  78. BufferedReader reader = null;
  79. try {
  80. // 定义BufferedReader输入流来读取URL的响应
  81. reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
  82. String line = null;
  83. while ((line = reader.readLine()) != null) {
  84. //System.out.println(line);
  85. buffer.append(line);
  86. }
  87. if(result==null){
  88. result = buffer.toString();
  89. }
  90. } catch (IOException e) {
  91. System.out.println("发送POST请求出现异常!" + e);
  92. e.printStackTrace();
  93. throw new IOException("数据读取异常");
  94. } finally {
  95. if(reader!=null){
  96. reader.close();
  97. }
  98. }
  99. return result;
  100. }
  101.  
  102. // 测试使用
  103. public static void main(String[] args) throws IOException {
  104. String filePath = "需要上传的文件路径"; // 如d:/test.pdf
  105. String sendUrl = "http://192.168.0.125:8080/dataProvider/uploadReport";
  106. String result = null;
  107. FileUpload fileUpload = new FileUpload();
  108. result = fileUpload.send(sendUrl, filePath);
  109. System.out.println(result);
  110. }
  111. }

在测试的时候,如果出现http 400错误,那就是模仿form表单的格式不正确,不能解析出相关信息。 错误的地方一般在(注意换行与空行):

java模拟form上传数据的更多相关文章

  1. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)

    先上代码: public void uploadToUrl(String fileId, String fileSetId, String formUrl) throws Throwable { St ...

  2. java模拟浏览器上传文件

    public static void main(String[] args) { String str = uploadFile("C:/Users/RGKY/Desktop/wKgBHVb ...

  3. c# 模拟表单提交,post form 上传文件、大数据内容

    表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipart/form-data,而且要设定一个 boundary 参数,这个参数是由应用程序自行产生,它会用来识别每 ...

  4. c# 模拟表单提交,post form 上传文件、数据内容

    转自:https://www.cnblogs.com/DoNetCShap/p/10696277.html 表单提交协议规定:要先将 HTTP 要求的 Content-Type 设为 multipar ...

  5. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  6. 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件

    [源码下载] 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  7. Java Web文件上传

    参考资料:http://www.cnblogs.com/xdp-gacl/p/4200090.html 一.问题描述 Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个 ...

  8. java web 文件上传下载

    文件上传下载案例: 首先是此案例工程的目录结构:

  9. java 实现文件上传下载以及查看

    项目的目录结构 代码  IOUtils.java package cn.edu.zyt.util; import java.io.IOException; import java.io.InputSt ...

随机推荐

  1. dij与prim算法

    两种算法本质是相同的. 都是从某一个点开始进行延伸,不断更新一个dis值,直到所有的点都被遍历到,从而求出一个最短路或者是一个树的边权的最小总和. 朴素算法都是n^2,都可以采用堆优化处理,降低复杂度 ...

  2. 洛谷P1012 拼数 string

    又是大水题... 这一题过水,令人无法接受...... 但是如果我们不知道string的一个神奇的性质的话,就会很难受. 我一开始手写 < 号,但是发现如果 string a 的前一部分恰好是 ...

  3. C++中的STL中map用法详解

    Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时 ...

  4. MATLAB:增加噪声,同时多次叠加噪声图和原图以及求平均图像(imnoise,imadd函数)

    本次涉及了对原图像增加高斯噪声.多次叠加原图和高斯噪声图以及叠加后的平均图像. close all; %关闭当前所有图形窗口,清空工作空间变量,清除工作空间所有变量 clear all; clc; R ...

  5. 【codeforces】【Round#523D】TV shows

    题意:n个节目,每个节目的播放时间为[li,ri],你需要选择一些电视机全部播放这些节目,一台电视机不能同时播放多个节目,选择一个新的电视机代价为x , 如果某台电视机的使用时间为[Li,Ri]需要付 ...

  6. 关于checkbox全选与全不选的实现与遇到的问题

    HTML: <div class="outbox"> <label for="box">全选</label> <inp ...

  7. java代码示例(5)

    /** * 需求分析:从键盘输入5名学员某门课程的笔试成绩,并求出五门成绩的总成绩和平均成绩 * @author chenyanlong * 日期:2017/10/14 */ package com. ...

  8. kafka channle的应用案例

      kafka channle的应用案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在新公司负责大数据平台的建设,平台搭建完毕后,需要将云平台(我们公司使用的Ucloud的 ...

  9. brctl创建虚拟网卡详解

    brctl创建虚拟网卡详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 很久之前我分享过一篇关于搭建Openvpn的笔记,在笔记的最后我分享了一个脚本,是用来创建虚拟网卡的,今天 ...

  10. adb 安装apk到只当设备

    1.adb devices 2,选择指定的设备,如上面的那个 然后:adb -s 292be8597d94 install *apk