模拟form表单提交(包含文件上传)
2015-05-18 15:53
302 查看
import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; /** * 模拟html表单提交数据。 */ public class HttpMultipartRequest { // 每个post参数之间的分隔 static final String BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy"; public static void main(String[] args) { Map<String,String> stringParams = new HashMap<String,String>(); stringParams.put("do", "justDoIt"); stringParams.put("myname", "aa我是一个测试cc123"); stringParams.put("description","bb我是码农我是一个测试我是一个测试cc567"); Map<String,File> fileParams = new HashMap<String,File>(); // fileParams.put("zhengqiuyijianhan", new File("D:\\ClientTcpSend.java")); fileParams.put("yaoqinghanyiwen", new File("D:\\xxxx.xlsx")); fileParams.put("yaoqinghan", new File("D:\\yyyyy.docx")); HttpMultipartRequest req = new HttpMultipartRequest( "http://localhost:8087/snptcfams/back/jsp/task/mockfilltask.html?saveflag=0", stringParams, fileParams); try { byte[] response = req.sendPost(); System.out.println(new String(response)); } catch (Exception e) { e.printStackTrace(); } } // 连接的地址 private String urlStr; // 文字post项集 strParams 1:key 2:value private Map<String,String> strParams; // 文件的post项集 fileParams 1:fileField, 2.fileName, 3.fileType, 4.filePath private Map<String,File> fileParams; /** * 建立一个request连接 * * @param urlStr * @param strParams * 1:key 2:value * @param fileParams * 1:key 2:value */ public HttpMultipartRequest(String urlStr, Map<String,String> strParams, Map<String,File> fileParams) { this.urlStr = urlStr; this.strParams = strParams; this.fileParams = fileParams; } /** * 向服务器发送post请求 * * @return byte[] * @throws Exception */ public byte[] sendPost() throws Exception { // http连接器 HttpURLConnection hc = null; // byte输出流,用来读取服务器返回的信息 ByteArrayOutputStream bos = null; // 输入流,用来读取服务器返回的信息 InputStream is = null; // 保存服务器返回的信息的byte数组 byte[] res = null; try { URL url = new URL(urlStr); hc = (HttpURLConnection) url.openConnection(); hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); hc.setRequestProperty("Charsert", "UTF-8"); // 发送POST请求必须设置如下两行 hc.setDoOutput(true); hc.setDoInput(true); hc.setUseCaches(false); hc.setRequestMethod("POST"); OutputStream dout = hc.getOutputStream(); // //1.先写文字形式的post流 // 头 String boundary = BOUNDARY; // 中 StringBuffer resSB = new StringBuffer("\r\n"); // 尾 String endBoundary = "\r\n--" + boundary + "--\r\n"; // strParams 1:key 2:value if (strParams != null) { for (String key : strParams.keySet()) { String value = strParams.get(key); resSB.append("--").append(boundary).append("\r\n") .append("Content-Disposition: form-data; name=\"") .append(key).append("\"\r\n").append("\r\n") .append(value).append("\r\n"); } } String boundaryMessage = resSB.toString(); System.out.println("boundaryMessage:" + boundaryMessage); // 写出流 dout.write(boundaryMessage.getBytes("utf-8")); // 2.再写文件开式的post流 // fileParams 1:fileField, 2.fileName, 3.fileType, 4.filePath resSB = new StringBuffer(); if (fileParams != null) { for (String fileField:fileParams.keySet()) { File tempFile = fileParams.get(fileField); String filePath = tempFile.getPath(); // System.out.println("tempFile:" + tempFile +"\r\n" // + "fileName:" + fileName +"\r\n" // + "filePath:" + filePath +"\r\n" // ); resSB.append("--").append(boundary).append("\r\n") .append("Content-Disposition: form-data; name=\"") .append(fileField).append("\"; filename=\"") .append(filePath).append("\"\r\n") .append("Content-Type:application/octet-stream\r\n\r\n") .append("\r\n\r\n"); dout.write(resSB.toString().getBytes("utf-8")); // 开始写文件 File file = new File(filePath); DataInputStream in = new DataInputStream( new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024 * 5]; while ((bytes = in.read(bufferOut)) != -1) { dout.write(bufferOut, 0, bytes); } in.close(); } } // 3.最后写结尾 dout.write(endBoundary.getBytes("utf-8")); dout.close(); int ch; is = hc.getInputStream(); bos = new ByteArrayOutputStream(); while ((ch = is.read()) != -1) { bos.write(ch); } res = bos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bos != null) bos.close(); if (is != null) is.close(); } catch (Exception e2) { e2.printStackTrace(); } } return res; } }
参考链接:http://my.oschina.net/u/1377774/blog/284699
相关文章推荐
- 用java模拟html表单(form)提交数据包含多文件上传表单提交。
- 使用HttpClient4提交包含上传文件的表单
- ajax提交表单form,form包含文件上传
- 表单包含file上传文件提交,使用ajaxSubmint或者ajaxForm 遇到的问题以及解决方法
- 使用FormData对包含文件类型的form表单进行异步提交(文件上传)并配置回调
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
- 解决post提交表单(文件上传) request.getParameter 取值为空的问题
- 用AJAX异步提交表单上传多个文件(type=‘file‘)案例
- ajax提交表单、ajax实现文件上传
- 在JSP表单提交中怎样在Servlet中处理文件上传并且获取JSP页面传过来的一些参数
- php表单提交,get 、post 和文件上传
- 使用ajax提交form表单,包括ajax文件上传
- 使用ajax提交form表单,包括ajax文件上传
- SpringMvc项目Form提交包含上传文件的请求以及回调
- 文件上传类型表单不能提交的问题
- ajax(三) ajax提交表单、ajax实现文件上传
- FromData提交表单及上传文件
- servlet文件上传2——复合表单提交(数据获取和文件上传)
- C#后台代码 Post 提交表单上传文件及其他信息
- 模拟提交有文件上传的表单(通过http模拟上传文件)