package com.litesuits.server; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.*; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.ByteArrayBody; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.InputStreamBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.nio.charset.Charset; import java.util.*; import java.util.Map.Entry; /** * Servlet implementation class PostReceiver */ @WebServlet(description = "接受Get/Post请求", urlPatterns = {"/get", "/upload"}) public class PostReceiver extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public PostReceiver() { super(); // TODO Auto-generated constructor stub } private void sendRequest(HttpEntity entity) { try { HttpPost post = new HttpPost("http://localhost:8080/get?a=1&b=b.34&a=4"); post.setEntity(entity); HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); CloseableHttpClient hc = httpClientBuilder.build(); hc.execute(post); } catch (IOException e) { e.printStackTrace(); } } private HttpEntity getMultipartEntity(String path) throws UnsupportedEncodingException, FileNotFoundException { MultipartEntity entity = new MultipartEntity(); entity.addPart("stringKey", new StringBody("StringBody", "text/plain", Charset.forName("utf-8"))); byte[] bytes = new byte[]{1, 2, 3}; entity.addPart("bytesKey", new ByteArrayBody(bytes, "bytesfilename")); entity.addPart("fileKey", new FileBody(new File(path + "well.png"))); entity.addPart("isKey", new InputStreamBody(new FileInputStream(new File(path + "well.png")), "iswell.png")); return entity; } private HttpEntity getUrlEncodedFormEntity() throws UnsupportedEncodingException { ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); list.add(new BasicNameValuePair("c", "ccc")); list.add(new BasicNameValuePair("d", "ddd")); list.add(new BasicNameValuePair("e", "eee")); HttpEntity en = new UrlEncodedFormEntity(list, "gbk"); return en; } private HttpEntity getStringEntity() { StringEntity se = new StringEntity("哈哈,2013年1月23日 - I'm using Android to send English.", "utf-8"); return se; } private HttpEntity getByteArrayEntity() throws UnsupportedEncodingException { ByteArrayEntity be = new ByteArrayEntity(new byte[]{1, 2, 3, 4, 5, 6, 7}); return be; } private HttpEntity getFileEntity(String path) throws UnsupportedEncodingException { HttpEntity en = new FileEntity(new File(path + "well.png"), "image/jpeg"); return en; } private HttpEntity getInputStreamEntity(String path) throws UnsupportedEncodingException, FileNotFoundException { HttpEntity en = new InputStreamEntity(new FileInputStream(new File(path + "well.png"))); return en; } private HttpEntity getSerializableEntity() throws UnsupportedEncodingException { HashMap<String, List<String>> map = new HashMap<>(); List<String> list1 = new ArrayList<>(); list1.add("abc"); list1.add("11"); list1.add("1110"); List<String> list2 = new ArrayList<>(); list1.add("def"); list1.add("22"); list1.add("2220"); map.put("key1", list1); map.put("key2", list2); HttpEntity en = new SerializableEntity(map); return en; } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getServletContext().getRealPath("/"); // sendRequest(getMultipartEntity(path)); sendRequest(getUrlEncodedFormEntity()); // sendRequest(getStringEntity()); // sendRequest(getByteArrayEntity()); // sendRequest(getFileEntity(path)); // sendRequest(getInputStreamEntity(path)); // sendRequest(getSerializableEntity()); // sendRequest(get); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //String fileDir = "D:\\Downloads"; //这是我的Mac笔记本上的位置,开发者设置为合适自己的文件夹,尤其windows系统。 String fileDir = "/Users/matianyu/downloads/lite-http-v3/"; String contentType = request.getContentType(); System.out.println("_________________ content type: " + contentType); // 接受一般参数 Map<String, String[]> map = request.getParameterMap(); if (map.size() > 0) { System.out.println("_________________ http params - start"); for (Entry<String, String[]> en : map.entrySet()) { System.out.println(en.getKey() + " : " + Arrays.toString(en.getValue())); } System.out.println("_________________ http params - over"); } response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); // 接受文件和流 PrintWriter writer = response.getWriter(); writer.println("contentType:" + contentType); if (contentType != null) { if (contentType.startsWith("multipart")) { //向客户端发送响应正文 try { //创建一个基于硬盘的FileItem工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //设置向硬盘写数据时所用的缓冲区的大小,此处为4K factory.setSizeThreshold(4 * 1024); //设置临时目录 factory.setRepository(new File(fileDir)); //创建一个文件上传处理器 ServletFileUpload upload = new ServletFileUpload(factory); //设置允许上传的文件的最大尺寸,此处为100M upload.setSizeMax(100 * 1024 * 1024); Map<String, List<FileItem>> itemMap = upload.parseParameterMap(request); for (List<FileItem> items : itemMap.values()) { Iterator iter = items.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (item.isFormField()) { processFormField(item, writer); //处理普通的表单域 } else { processUploadedFile(fileDir, item, writer); //处理上传文件 } } } } catch (Exception ex) { ex.printStackTrace(); } } else if (contentType.contains("text") || contentType.contains("json") || contentType.contains("application/x-www-form-urlencoded") || contentType.contains("xml")) { processString(request); } else { processEntity(fileDir, request); } } else { processString(request); } System.out.println("doPost over"); writer.print("upload over. "); } private void processString(HttpServletRequest request) { try { BufferedReader reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\n\r"); } System.out.println("content body: " + sb); } catch (IOException e) { e.printStackTrace(); } } private void processEntity(String dir, HttpServletRequest request) { try { System.out.println("try to save file..."); File uploadFile = new File(dir, "upload"); if(!uploadFile.getParentFile().exists()){ uploadFile.getParentFile().mkdirs(); } InputStream input = request.getInputStream(); OutputStream output = new FileOutputStream(uploadFile); byte[] buffer = new byte[4096]; int n = -1; while ((n = input.read(buffer)) != -1) { if (n > 0) { output.write(buffer, 0, n); } } output.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 处理表单字符数据 */ private void processFormField(FileItem item, PrintWriter writer) { String name = item.getFieldName(); String value = item.getString(); writer.println("Form Part [" + name + "] value :" + value + "\r\n"); System.out.println("Form Part [" + name + "] value :" + value + "\r\n"); } /** * 处理表单文件 */ private void processUploadedFile(String filePath, FileItem item, PrintWriter writer) throws Exception { String filename = item.getName(); int index = filename.lastIndexOf("\\"); filename = filename.substring(index + 1, filename.length()); long fileSize = item.getSize(); if (filename.equals("") && fileSize == 0) return; File uploadFile = new File(filePath + "/" + filename); item.write(uploadFile); writer.println( "File Part [" + filename + "] is saved." + " contentType: " + item .getContentType() + " , size: " + fileSize + "\r\n"); System.out.println( "File Part [" + filename + "] is saved." + " contentType: " + item .getContentType() + " , size: " + fileSize); } }