HttpClient4模拟带文件上传的表单提交

这里用apache的HttpClient4.3模拟文件上传,上传到一个java servlet,然后用servlet解析,把上传文件放到服务器目录下


下面这个java应用,往一个java servlet中提交了一个文件,和几个普通表单属性

[java]  view plain  copy
  1. package com.test.httpClient;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5. import java.nio.charset.Charset;  
  6.   
  7. import org.apache.http.Consts;  
  8. import org.apache.http.HttpEntity;  
  9. import org.apache.http.client.methods.CloseableHttpResponse;  
  10. import org.apache.http.client.methods.HttpPost;  
  11. import org.apache.http.entity.ContentType;  
  12. import org.apache.http.entity.mime.MultipartEntityBuilder;  
  13. import org.apache.http.entity.mime.content.FileBody;  
  14. import org.apache.http.entity.mime.content.StringBody;  
  15. import org.apache.http.impl.client.CloseableHttpClient;  
  16. import org.apache.http.impl.client.HttpClients;  
  17. import org.apache.http.util.EntityUtils;  
  18.   
  19.   
  20. public class ClientMultipartFormPost {  
  21.   
  22.     /** 
  23.      * 这个例子展示了如何执行请求包含一个多部分编码的实体 
  24.      * 模拟表单提交 
  25.      * @throws IOException  
  26.      */  
  27.     public static void main(String[] args) throws IOException {  
  28.         CloseableHttpClient httpClient = HttpClients.createDefault();  
  29.         try{  
  30.             //要上传的文件的路径  
  31.             String filePath = "D:\\my_shutdown.log";  
  32.             //把一个普通参数和文件上传给下面这个地址    是一个servlet  
  33.             HttpPost httpPost = new HttpPost("http://localhost:80/testjs/servlet/UploadServlet");  
  34.             //把文件转换成流对象FileBody  
  35.             FileBody bin = new FileBody(new File(filePath));  
  36.             //普通字段  重新设置了编码方式  
  37.             StringBody comment = new StringBody("这里是一个评论", ContentType.create("text/plain", Consts.UTF_8));  
  38.             //StringBody comment = new StringBody("这里是一个评论", ContentType.TEXT_PLAIN);  
  39.               
  40.             StringBody name = new StringBody("王五", ContentType.create("text/plain", Consts.UTF_8));  
  41.             StringBody password = new StringBody("123456", ContentType.create("text/plain", Consts.UTF_8));  
  42.               
  43.             HttpEntity reqEntity = MultipartEntityBuilder.create()  
  44.             .addPart("media", bin)//相当于<input type="file" name="media"/>  
  45.             .addPart("comment", comment)  
  46.             .addPart("name", name)//相当于<input type="text" name="name" value=name>  
  47.             .addPart("password", password)  
  48.             .build();  
  49.               
  50.             httpPost.setEntity(reqEntity);  
  51.               
  52.             System.out.println("发起请求的页面地址 " + httpPost.getRequestLine());  
  53.             //发起请求   并返回请求的响应  
  54.             CloseableHttpResponse response = httpClient.execute(httpPost);  
  55.             try {  
  56.                 System.out.println("----------------------------------------");  
  57.                 //打印响应状态  
  58.                 System.out.println(response.getStatusLine());  
  59.                 //获取响应对象  
  60.                 HttpEntity resEntity = response.getEntity();  
  61.                 if (resEntity != null) {  
  62.                     //打印响应长度  
  63.                     System.out.println("Response content length: " + resEntity.getContentLength());  
  64.                     //打印响应内容  
  65.                     System.out.println(EntityUtils.toString(resEntity,Charset.forName("UTF-8")));  
  66.                 }  
  67.                 //销毁  
  68.                 EntityUtils.consume(resEntity);  
  69.             } finally {  
  70.                 response.close();  
  71.             }  
  72.         }finally{  
  73.             httpClient.close();  
  74.         }  
  75.     }  
  76.   
  77. }  

用于接收的java servlet  用到了apache的common-fileupload来解析请求main中提交的参数

[java]  view plain  copy
  1.   
[java]  view plain  copy
  1. package com.vincente.test.servlet;  
  2.   
  3.   
  4. import java.io.BufferedReader;  
  5. import java.io.DataInputStream;  
  6. import java.io.DataOutputStream;  
  7. import java.io.File;  
  8. import java.io.FileInputStream;  
  9. import java.io.IOException;  
  10. import java.io.InputStream;  
  11. import java.io.InputStreamReader;  
  12. import java.io.OutputStream;  
  13. import java.io.PrintWriter;  
  14. import java.net.HttpURLConnection;  
  15. import java.net.URL;  
  16. import java.util.Iterator;  
  17. import java.util.List;  
  18.   
  19.   
  20. import javax.servlet.ServletException;  
  21. import javax.servlet.http.HttpServlet;  
  22. import javax.servlet.http.HttpServletRequest;  
  23. import javax.servlet.http.HttpServletResponse;  
  24.   
  25.   
  26. import org.apache.commons.fileupload.FileItem;  
  27. import org.apache.commons.fileupload.FileItemFactory;  
  28. import org.apache.commons.fileupload.FileUploadException;  
  29. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  30. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  31.   
  32.   
  33. public class UploadServlet extends HttpServlet {  
  34.   
  35.   
  36.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  37.             throws ServletException, IOException {  
  38.   
  39.     }  
  40.   
  41.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  42.             throws ServletException, IOException {  
  43.         request.setCharacterEncoding("utf-8");  
  44.         response.setCharacterEncoding("utf-8");  
  45.           
  46.         //利用apache的common-upload上传组件来进行  来解析获取到的流文件  
  47.           
  48.         //把上传来的文件放在这里  
  49.         String uploadPath = getServletContext().getRealPath("/upload");//获取文件路径   
  50.           
  51.         //检测是不是存在上传文件  
  52.         // Check that we have a file upload request  
  53.         boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
  54.           
  55.         if(isMultipart){  
  56.               
  57.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  58.             //指定在内存中缓存数据大小,单位为byte,这里设为1Mb  
  59.             factory.setSizeThreshold(1024*1024);  
  60.             //设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录   
  61.             factory.setRepository(new File("D://temp"));  
  62.             // Create a new file upload handler  
  63.             ServletFileUpload upload = new ServletFileUpload(factory);  
  64.             // 指定单个上传文件的最大尺寸,单位:字节,这里设为5Mb    
  65.             upload.setFileSizeMax(5 * 1024 * 1024);    
  66.             //指定一次上传多个文件的总尺寸,单位:字节,这里设为10Mb    
  67.             upload.setSizeMax(10 * 1024 * 1024);     
  68.             upload.setHeaderEncoding("UTF-8"); //设置编码,因为我的jsp页面的编码是utf-8的   
  69.               
  70.             List<FileItem> items = null;  
  71.               
  72.             try {  
  73.                 // 解析request请求  
  74.                 items = upload.parseRequest(request);  
  75.             } catch (FileUploadException e) {  
  76.                 e.printStackTrace();  
  77.             }  
  78.             if(items!=null){  
  79.                 //把上传文件放到服务器的这个目录下  
  80.                 if (!new File(uploadPath).isDirectory()){    
  81.                     new File(uploadPath).mkdirs(); //选定上传的目录此处为当前目录,没有则创建    
  82.                 }   
  83.                 //解析表单项目  
  84.                 // Process the uploaded items  
  85.                 Iterator<FileItem> iter = items.iterator();  
  86.                 while (iter.hasNext()) {  
  87.                     FileItem item = iter.next();  
  88.                     //如果是普通表单属性  
  89.                     if (item.isFormField()) {  
  90.                         //<input type="text" name="content">  
  91.                         String name = item.getFieldName();//相当于input的name属性  
  92.                         String value = item.getString();//input的value属性  
  93.                         System.out.println("属性:"+name+" 属性值:"+value);  
  94.                     }  
  95.                     //如果是上传文件  
  96.                     else {  
  97.                         //属性名  
  98.                         String fieldName = item.getFieldName();  
  99.                         //上传文件路径  
  100.                         String fileName = item.getName();  
  101.                         fileName = fileName.substring(fileName.lastIndexOf("/")+1);// 获得上传文件的文件名  
  102.                         try {  
  103.                             item.write(new File(uploadPath,fileName));  
  104.                         } catch (Exception e) {  
  105.                             e.printStackTrace();  
  106.                         }  
  107.                         //给请求页面返回响应  
  108.                         response.getWriter().println("文件上传成功! 文件名是:"+fileName);  
  109.                     }  
  110.                 }  
  111.             }  
  112.         }  
  113.           
  114.     <span style="font-family:Arial, Helvetica, sans-serif;">    }</span>  
[java]  view plain  copy
  1. <span style="font-family:Arial, Helvetica, sans-serif;"></span>  
[plain]  view plain  copy
  1. main中的执行结果:  
  2. 发起请求的页面地址 POST http://localhost:80/testjs/servlet/UploadServlet HTTP/1.1  
  3. ----------------------------------------  
  4. HTTP/1.1 200 OK  
  5. Response content length: 50  
  6. 文件上传成功! 文件名是:my_shutdown.log  
  7.   
  8.   
  9. tomcat中的执行结果:  
  10. 属性:comment 属性值:这里是一个评论  
  11. 属性:name 属性值:王五  
  12. 属性:password 属性值:123456  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值