天天看點

HTTP利用MultipartEntityBuilder模拟表單上傳檔案

Java代碼 

  1.      public Map<String,Object> uploadFileByHTTP(File postFile,String postUrl,Map<String,String> postParam){  
  2.          Map<String,Object> resultMap = new HashMap<String,Object>();  
  3.          CloseableHttpClient httpClient = HttpClients.createDefault();    
  4.          try{    
  5.              //把一個普通參數和檔案上傳給下面這個位址    是一個servlet    
  6.              HttpPost httpPost = new HttpPost(postUrl);    
  7.              //把檔案轉換成流對象FileBody  
  8.              FileBody fundFileBin = new FileBody(postFile);    
  9.              //設定傳輸參數  
  10.              MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();    
  11.              multipartEntity.addPart(postFile.getName(), fundFileBin);//相當于<input type="file" name="media"/>    
  12.              //設計檔案以外的參數  
  13.              Set<String> keySet = postParam.keySet();  
  14.              for (String key : keySet) {  
  15.                 //相當于<input type="text" name="name" value=name>    
  16.                 multipartEntity.addPart(key, new StringBody(postParam.get(key), ContentType.create("text/plain", Consts.UTF_8)));    
  17.              }  
  18.              HttpEntity reqEntity =  multipartEntity.build();   
  19.              httpPost.setEntity(reqEntity);    
  20.              log.info("發起請求的頁面位址 " + httpPost.getRequestLine());    
  21.              //發起請求   并傳回請求的響應    
  22.              CloseableHttpResponse response = httpClient.execute(httpPost);    
  23.              try {    
  24.                  log.info("----------------------------------------");    
  25.                  //列印響應狀态    
  26.                  log.info(response.getStatusLine());  
  27.                  resultMap.put("statusCode", response.getStatusLine().getStatusCode());  
  28.                  //擷取響應對象    
  29.                  HttpEntity resEntity = response.getEntity();    
  30.                  if (resEntity != null) {    
  31.                      //列印響應長度    
  32.                      log.info("Response content length: " + resEntity.getContentLength());    
  33.                      //列印響應内容    
  34.                      resultMap.put("data", EntityUtils.toString(resEntity,Charset.forName("UTF-8")));  
  35.                  }    
  36.                  //銷毀    
  37.                  EntityUtils.consume(resEntity);    
  38.              } catch (Exception e) {  
  39.                  e.printStackTrace();  
  40.              } finally {    
  41.                  response.close();    
  42.              }    
  43.          } catch (ClientProtocolException e1) {  
  44.             e1.printStackTrace();  
  45.          } catch (IOException e1) {  
  46.             e1.printStackTrace();  
  47.          } finally{    
  48.              try {  
  49.                 httpClient.close();  
  50.              } catch (IOException e) {  
  51.                 e.printStackTrace();  
  52.              }    
  53.          }  
  54.         log.info("uploadFileByHTTP result:"+resultMap);  
  55.         return resultMap;    
  56.      }  

 servlet接收代碼:

Java代碼  

  1. package com.pingan.web;  
  2. import java.io.File;  
  3. import java.io.IOException;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.annotation.WebServlet;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11. import org.apache.commons.fileupload.FileItem;  
  12. import org.apache.commons.fileupload.FileUploadException;  
  13. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
  14. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
  15. import com.alibaba.fastjson.JSONObject;  
  16. @WebServlet(description = "檔案上傳", urlPatterns = { "/FileUploadServlet" })  
  17. public class FileUploadServlet extends HttpServlet {  
  18.     private static final long serialVersionUID = 1L;  
  19.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  20.         this.doPost(request, response);  
  21.     }  
  22.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  23.         request.setCharacterEncoding("utf-8");  
  24.         response.setCharacterEncoding("utf-8");  
  25.         //利用apache的common-upload上傳元件來進行  來解析擷取到的流檔案  
  26.         //把上傳來的檔案放在這裡  
  27.         String uploadPath = getServletContext().getRealPath("/upload");//擷取檔案路徑   
  28.         //檢測是不是存在上傳檔案  
  29.         // Check that we have a file upload request  
  30.         boolean isMultipart = ServletFileUpload.isMultipartContent(request);  
  31.         if(isMultipart){  
  32.             DiskFileItemFactory factory = new DiskFileItemFactory();  
  33.             //指定在記憶體中緩存資料大小,機關為byte,這裡設為1Mb  
  34.             factory.setSizeThreshold(1024*1024);  
  35.             //設定一旦檔案大小超過getSizeThreshold()的值時資料存放在硬碟的目錄   
  36.             factory.setRepository(new File("D://temp"));  
  37.             // Create a new file upload handler  
  38.             ServletFileUpload upload = new ServletFileUpload(factory);  
  39.             // 指定單個上傳檔案的最大尺寸,機關:位元組,這裡設為5Mb    
  40.             upload.setFileSizeMax(5 * 1024 * 1024);    
  41.             //指定一次上傳多個檔案的總尺寸,機關:位元組,這裡設為10Mb    
  42.             upload.setSizeMax(10 * 1024 * 1024);     
  43.             upload.setHeaderEncoding("UTF-8"); //設定編碼,因為我的jsp頁面的編碼是utf-8的   
  44.             List<FileItem> items = null;  
  45.             try {  
  46.                 // 解析request請求  
  47.                 items = upload.parseRequest(request);  
  48.             } catch (FileUploadException e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.             if(items!=null){  
  52.                 //把上傳檔案放到伺服器的這個目錄下  
  53.                 if (!new File(uploadPath).isDirectory()){    
  54.                     new File(uploadPath).mkdirs(); //標明上傳的目錄此處為目前目錄,沒有則建立    
  55.                 }   
  56.                 //解析表單項目  
  57.                 // Process the uploaded items  
  58.                 Iterator<FileItem> iter = items.iterator();  
  59.                 while (iter.hasNext()) {  
  60.                     FileItem item = iter.next();  
  61.                     //如果是普通表單屬性  
  62.                     if (item.isFormField()) {  
  63.                         //<input type="text" name="content">  
  64.                         String name = item.getFieldName();//相當于input的name屬性  
  65.                         String value = item.getString();//input的value屬性  
  66.                         System.out.println("屬性:"+name+" 屬性值:"+value);  
  67.                     }  
  68.                     //如果是上傳檔案  
  69.                     else {  
  70.                         //屬性名  
  71.                         String fieldName = item.getFieldName();  
  72.                         //上傳檔案路徑  
  73.                         String fileName = item.getName();  
  74.                         fileName = fileName.substring(fileName.lastIndexOf("/")+1);// 獲得上傳檔案的檔案名  
  75.                         try {  
  76.                             item.write(new File(uploadPath,fileName));  
  77.                         } catch (Exception e) {  
  78.                             e.printStackTrace();  
  79.                         }  
  80.                         //給請求頁面傳回響應  
  81.                         JSONObject jsonObject = new JSONObject();  
  82.                         jsonObject.put("code", "0000");  
  83.                         jsonObject.put("msg", "檔案上傳成功! 檔案名是:"+fileName);  
  84.                         response.getWriter().println(jsonObject.toJSONString());  
  85.                     }  
  86.                 }  
  87.             }  
  88.         }  
  89.     }  
  90. }  

測試main方法:

Java代碼 

  1. public static void main(String[] args) {  
  2.         HttpsFileUtils httpsUtils = new HttpsFileUtils();  
  3.         //要上傳的檔案的路徑    
  4.         String filePath = "D:/git/fastPlat/commonWeb/src/com/pingan/file/data/base64_New2.jpg";    
  5.         String postUrl  = "http://localhost:8080/commonWeb/FileUploadServlet";  
  6.         Map<String,String> postParam = new HashMap<String,String>();  
  7.         postParam.put("custNo", "11122");  
  8.         File postFile = new File(filePath);  
  9.         Map<String,Object> resultMap = httpsUtils.uploadFileByHTTP(postFile,postUrl,postParam);  
  10.         System.out.println(resultMap);  
  11.     }  

繼續閱讀