应用程序模拟表单向Servlet传送属性和文件
来源:互联网 发布:iphone还原网络设置后 编辑:程序博客网 时间:2024/06/05 00:10
原文参考地址 :http://blog.csdn.net/pathuang68/article/details/6920076
找了半天,找到上面的原文地址,然后试了试,发现word等生成了文件,但打不开。然后就发了一个.txt文件,发现文件最后多出了MIME的协议头。
发送文件的核心代码主要是HttpPostEmulator.java类,看了一下作者的写的格式,又参考了一下MIME的书写方式,改进了一下
HttpPostEmulator类:
import java.io.BufferedReader;import java.io.DataInputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL;import java.util.ArrayList;public class HttpPostEmulator {//每个post参数之间的分隔。随意设定,只要不会和其他的字符串重复即可。 private static final String BOUNDARY ="----------HV2ymHFg03ehbqgZCaKO6jyH"; public String sendHttpPostRequest(String serverUrl ,ArrayList<FormFieldKeyValuePair>generalFormFields, ArrayList<UploadFileItem>filesToBeUploaded) throws Exception{ // 向服务器发送post请求 URL url = new URL(serverUrl/*"http://127.0.0.1:8080/test/upload"*/); HttpURLConnection connection= (HttpURLConnection) url.openConnection(); // 发送POST请求必须设置如下两行 connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod("POST"); connection.setRequestProperty("Connection","Keep-Alive"); connection.setRequestProperty("Charset","UTF-8"); connection.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY); // 头 String boundary = BOUNDARY; boolean isParams = false; // 传输内容 StringBuffer contentBody =new StringBuffer(); // 尾 String endBoundary ="\r\n--" + boundary + "--\r\n"; OutputStream out =connection.getOutputStream(); // 1. 处理普通表单域(即形如key = value对)的POST请求 for(FormFieldKeyValuePair ffkvp : generalFormFields){ isParams = true; contentBody.append("--"+BOUNDARY).append("\r\n") .append("Content-Disposition: form-data; name=\"") .append(ffkvp.getKey() + "\"") .append("\r\n") .append("\r\n") .append(ffkvp.getValue()) .append("\r\n"); } //contentBody.append("\r\n"); String boundaryMessage1 =contentBody.toString(); if(isParams){ out.write(boundaryMessage1.getBytes("utf-8")); } // 2. 处理文件上传 for(UploadFileItem ufi :filesToBeUploaded){ contentBody = new StringBuffer(); contentBody.append("--"+BOUNDARY).append("\r\n") .append("Content-Disposition:form-data; name=\"") .append(ufi.getFormFieldName() +"\"; ") // form中field的名称 .append("filename=\"") .append(ufi.getFileName() +"\"") //上传文件的文件名,包括目录 .append("\r\n") .append("Content-Type:application/octet-stream") .append("\r\n\r\n"); String boundaryMessage2 = contentBody.toString(); out.write(boundaryMessage2.getBytes("utf-8")); // 开始真正向服务器写文件 File file = new File(ufi.getFileName()); DataInputStream dis= new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut =new byte[(int) file.length()]; bytes =dis.read(bufferOut); out.write(bufferOut,0, bytes); dis.close(); out.write("\r\n".getBytes("utf-8")); // contentBody.setLength(0);// contentBody.append("--"+BOUNDARY).append("\r\n"); //// String boundaryMessage = contentBody.toString();// out.write(boundaryMessage.getBytes("utf-8"));// System.out.println(boundaryMessage); } //out.write(("--"+ BOUNDARY + "--\r\n").getBytes("UTF-8")); // 3. 写结尾 out.write(endBoundary.getBytes("utf-8")); out.flush(); out.close(); // 4. 从服务器获得回答的内容 String strLine=""; String strResponse =""; InputStream in =connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); while((strLine =reader.readLine()) != null){ strResponse +=strLine +"\n"; } return strResponse; }}ClientPost类
import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;public class ClientPost { public static String sendForms(String servletURL,HashMap paramsMap,HashMap fileMap){ ArrayList<FormFieldKeyValuePair> ffkvp = new ArrayList<FormFieldKeyValuePair>(); if(paramsMap!=null){ Iterator iter = paramsMap.keySet().iterator(); while(iter.hasNext()){ String key = (String)iter.next(); String value = (String)paramsMap.get(key); ffkvp.add(new FormFieldKeyValuePair(key, value)); } } // 设定要上传的文件。UploadFileItem见后面的代码 ArrayList<UploadFileItem> ufi = new ArrayList<UploadFileItem>(); if(fileMap!=null){ Iterator iter = fileMap.keySet().iterator(); while(iter.hasNext()){ String key = (String)iter.next(); String value = (String)fileMap.get(key); //ufi.add(new UploadFileItem("upload1", "E:\\Asturias.mp3")); ufi.add(new UploadFileItem(key, value)); } } String response = ""; try{ HttpPostEmulator hpe = new HttpPostEmulator(); response =hpe.sendHttpPostRequest(servletURL, ffkvp, ufi); }catch(Exception ex){ System.out.println(ex.getMessage()); response = ex.getMessage(); } return response; }}
UploadFileItem类
import java.io.Serializable;public class UploadFileItem implements Serializable{private static final long serialVersionUID = 1L; // The form field name in a form used foruploading a file, // such as "upload1" in "<inputtype="file" name="upload1"/>" private String formFieldName; // File name to be uploaded, thefileName contains path, // such as "E:\\some_file.jpg" private String fileName; public UploadFileItem(String formFieldName, String fileName){ this.formFieldName =formFieldName; this.fileName = fileName; } public String getFormFieldName(){ return formFieldName; } public void setFormFieldName(String formFieldName){ this.formFieldName =formFieldName; } public String getFileName(){ return fileName; } public void setFileName(String fileName){ this.fileName = fileName; }}
FormFieldKeyValuePair.java
import java.io.Serializable;public class FormFieldKeyValuePair implements Serializable{ private static final long serialVersionUID = 1L; // The form field used for receivinguser's input, // such as "username" in "<inputtype="text" name="username"/>" private String key; // The value entered by user in thecorresponding form field, // such as "Patrick" the abovementioned formfield "username" private String value; public FormFieldKeyValuePair(String key, String value){ this.key = key; this.value = value; } public String getKey(){ return key; } public void setKey(String key){ this.key = key; } public String getValue(){ return value; } public void setValue(String value){ this.value = value; }}
ServerReceive类
import org.apache.commons.fileupload.FileItem;import org.apache.commons.fileupload.disk.DiskFileItemFactory;import org.apache.commons.fileupload.servlet.ServletFileUpload;public class ServerReceive extends HttpServlet{private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{ super.doGet(req, resp); } @SuppressWarnings({"unchecked", "deprecation" }) @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{ DiskFileItemFactory factory =new DiskFileItemFactory(); //得到绝对文件夹路径,比如"D:\\Tomcat6\\webapps\\test\\upload" String path = req.getRealPath("/upload"); //临时文件夹路径 String repositoryPath =req.getRealPath("/upload/temp"); // 设定临时文件夹为repositoryPath factory.setRepository(new File(repositoryPath)); // 设定上传文件的阈值,如果上传文件大于1M,就可能在repository // 所代 表的文件夹中产生临时文件,否则直接在内存中进行处理 factory.setSizeThreshold(1024* 1024); //System.out.println("----"+ req.getContextPath()); // 得到相对文件夹路径,比如 "/test" // 创建一个ServletFileUpload对象 ServletFileUpload uploader =new ServletFileUpload(factory); try{ // 调用uploader中的parseRequest方法,可以获得请求中的相关内容, // 即一个FileItem类型的ArrayList。FileItem是在 // org.apache.commons.fileupload中定义的,它可以代表一个文件, // 也可以代表一个普通的form field ArrayList<FileItem>list = (ArrayList<FileItem>)uploader.parseRequest(req); System.out.println(list.size()); for(FileItem fileItem : list){ if(fileItem.isFormField()){ // 如果是普通的form field String name = fileItem.getFieldName(); String value = fileItem.getString(); System.out.println(name+ " = " + value); } else { // 如果是文件 String value = fileItem.getName(); int start = value.lastIndexOf("\\"); String fileName = value.substring(start + 1); // 将其中包含的内容写到path(即upload目录)下, // 名为fileName的文件中 fileItem.write(new File(path, fileName)); } } }catch(Exception e) { e.printStackTrace(); } // 向客户端反馈结果 PrintWriter out =resp.getWriter(); out.print("OK"); out.flush(); out.close(); super.doPost(req, resp); }}
private String uploadFiles(HttpServletRequest request){ try{ HashMap fileMap = new HashMap(); String filePath = this.getClass().getClassLoader().getResource("/").toURI().getPath();String webRoot=filePath.substring(0,filePath.indexOf("WEB-INF"));filePath=webRoot+ "WEB-INF"; fileMap.put("file1", filePath + "\\test.docx"); fileMap.put("file2", filePath + "\\test.txt"); HashMap paramMap = new HashMap(); paramMap.put("userid", "111111"); paramMap.put("username", "danielinbiti"); String rtn = ClientPost.sendForms("http://localhost:8080/test/ServerReceive", paramMap, fileMap); return rtn; }catch(Exception ex){ System.out.println(ex.getMessage()); } return null; }
经过测试,多个属性和多种文件都可以支持了。
0 0
- 应用程序模拟表单向Servlet传送属性和文件
- httpclient模拟表单上传参数和文件
- dns集群和文件传送
- servlet接受form表单d值和文件上传
- html5表单和文件
- 应用程序向IIS传送身份验证
- 应用程序向IIS传送身份验证
- Unity3D与JSP TomCat服务器传递数据和文件( 二 ) Unity3D向java传输表单
- servlet文件上传2——复合表单提交(数据获取和文件上传)
- Java应用程序模拟向Servlet发送POST请求
- Java应用程序模拟向Servlet发送POST请求
- 文件夹和文件时间属性
- Python 日志向控制台和文件输出
- ajax提交表单和文件上传
- 去掉文件夹和文件的只读属性
- 目录和文件的的rwx属性
- Java(servlet)模拟表单提交
- 【Python】同时向控制台和文件输出日志logging
- IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解
- WdatePicker日历控件使用方法
- java2Word中关闭不了WINWORD进程问题的解决
- 一个抽奖算法
- wpf 可通知界面的Delegate命令
- 应用程序模拟表单向Servlet传送属性和文件
- lisp学习有感--对象化,结构化编程思想
- 一切成功源于积累——20140110 镑美实盘(1)
- Oracle RAC升级时遇到[INS-06006]的解决方法
- R Interface(R界面)
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- 根据excel模版导出数据到excel
- android的Bound Service----讲述进程间通信
- Android 系统签名及其在源代码中的使用