Программная отправка POST-HTTP-запроса, содержащего файлы, при помощи стандартных средств Java.

  1. import java.io.*;
  2. import java.net.HttpURLConnection;
  3. import java.net.URL;
  4. import java.util.List;
  5.  
  6. public class HTTPMultipartRequest {
  7.  
  8.     public static class Param {
  9.         private String name;
  10.         private String value;
  11.  
  12.         public Param(String name, String value) {
  13.             this.name = name;
  14.             this.value = value;
  15.         }
  16.  
  17.         public String getName() {
  18.             return name;
  19.         }
  20.  
  21.         public void setName(String name) {
  22.             this.name = name;
  23.         }
  24.  
  25.         public String getValue() {
  26.             return value;
  27.         }
  28.  
  29.         public void setValue(String value) {
  30.             this.value = value;
  31.         }
  32.     }
  33.  
  34.     public static class FileParam {
  35.         private String fileFieldName;
  36.         private File file;
  37.         private String fileName;
  38.         private String contentType;
  39.  
  40.         public FileParam(String fileFieldName, String fileName, File file, String contentType) {
  41.             this.fileFieldName = fileFieldName;
  42.             this.file = file;
  43.             this.fileName = fileName;
  44.             this.contentType = contentType;
  45.         }
  46.  
  47.         public String getFileFieldName() {
  48.             return fileFieldName;
  49.         }
  50.  
  51.         public File getFile() {
  52.             return file;
  53.         }
  54.  
  55.         public String getFileName() {
  56.             return fileName;
  57.         }
  58.  
  59.         public String getContentType() {
  60.             return contentType;
  61.         }
  62.     }
  63.  
  64.     private static final String BOUNDARY = "----------Vhgskgpwjxkjdfnldsnfjldsnjlbsndfbgdslfngfnldfg";
  65.  
  66.     private String url;
  67.     private List<Param> params;
  68.     private List<FileParam> fileParams;
  69.  
  70.  
  71.     public HTTPMultipartRequest(String url, List<Param> params, List<FileParam> fileParams) {
  72.         this.url = url;
  73.         this.params = params;
  74.         this.fileParams = fileParams;
  75.     }
  76.  
  77.     public byte[] send() {
  78.         HttpURLConnection hc = null;
  79.         InputStream is = null;
  80.         ByteArrayOutputStream bos = new ByteArrayOutputStream();
  81.         byte[] res = null;
  82.         try {
  83.             URL _url = new URL(url);
  84.             hc = (HttpURLConnection) _url.openConnection();
  85.             hc.setDoOutput(true);
  86.             hc.setDoInput(true);
  87.             hc.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
  88.             hc.setRequestMethod("POST");
  89.             OutputStream dout = hc.getOutputStream();
  90.  
  91.  
  92.             for (Param p : params) {
  93.                 dout.write(
  94.                         new StringBuffer().append("--").append(BOUNDARY)
  95.                                 .append("\r\n")
  96.                                 .append("Content-Disposition: form-data; name=\"").append(p.getName()).append("\"")
  97.                                 .append("\r\n\r\n")
  98.                                 .append(p.getValue())
  99.                                 .append("\r\n").toString().getBytes()
  100.                 );
  101.             }
  102.  
  103.  
  104.             for (FileParam fp : fileParams) {
  105.                 dout.write(
  106.                         new StringBuffer().append("--").append(BOUNDARY)
  107.                                 .append("\r\n")
  108.                                 .append("Content-Disposition: form-data; name=\"").append(fp.getFileFieldName()).append("\"; filename=\"").append(fp.getFileName()).append("\"")
  109.                                 .append("\r\n")
  110.                                 .append("Content-Type: ").append(fp.getContentType())
  111.                                 .append("\r\n\r\n").toString().getBytes()
  112.                 );
  113.                 byte[] fileBytes = new byte[(int) fp.getFile().length()];
  114.                 new FileInputStream(fp.getFile()).read(fileBytes);
  115.                 dout.write(fileBytes);
  116.                 dout.write("\r\n".getBytes());
  117.             }
  118.             dout.write(("\r\n--" + BOUNDARY + "--\r\n").getBytes());
  119.             dout.flush();
  120.             dout.close();
  121.             int ch;
  122.             is = hc.getInputStream();
  123.             while ((ch = is.read()) != -1) {
  124.                 bos.write(ch);
  125.             }
  126.             res = bos.toByteArray();
  127.         } catch (Exception e) {
  128.             e.printStackTrace();
  129.         } finally {
  130.             try {
  131.                 bos.close();
  132.  
  133.                 if (is != null)
  134.                     is.close();
  135.  
  136.                 if (hc != null)
  137.                     hc.disconnect();
  138.             } catch (Exception e2) {
  139.                 e2.printStackTrace();
  140.             }
  141.         }
  142.         return res;
  143.     }
  144. }
Возникла потребность отправить программно на некий адрес запрос, в котором содержатся параметры и файлы.
Представьте что у вас есть веб страница с формой, на которой несколько полей ввода текста, несколько селектов и прочее, а главное у вас есть поля для выбора файлов на диске, которые тоже будут отправлены при сабмите формы.
Сторонних библиотек хватает, в том числе и у апача, но мне, как любителю изобретать велосипеды, нужно все сделать по своему :) Да и к тому же мне не нужна вся та мощна что предоставляют эти библиотеки, мне нужен ясный и простой класс, который будет выполнять конкретную задачу. А как мы знаем – чем проще – тем и быстрее.

Почитал я про Multipart form data, немного покумекал, да и написал класс для работы со всем этим,все просто и понятно.


(c) copyright livecomp.blogspot.com

Мы в соцсетях

vk tw tg yt

Пожертвования

Аноним2850 р.
Freddy1700 р.
riseremi1611 р.
NaruTrey800 р.
vlavolk637 р.
  © aNNiMON (Melnik Software)