2012-11-19 20 views
7

Die Antwort auf eine Art von HTTP-Anfrage sende ich eine multipart/form-data sieht ungefähr so ​​aus:Bibliothek und Beispiele für das Parsen multipart/form-data aus Input

--------boundary123 
Content-Disposition: form-data; name="json" 
Content-Type: application/json 

{"some":"json"} 
--------boundary123 
Content-Disposition: form-data; name="bin" 
Content-Type: application/octet-stream 

<file data> 

--------boundary123 

Ich habe zu Apache benutze sende und empfange die HTTP-Anfragen, aber ich kann nicht finden, eine einfache Möglichkeit zu finden, es zu verwenden, um das oben genannte für einfachen Zugang der Formularfelder zu analysieren.

Ich würde es vorziehen, nicht das Rad neu zu erfinden, so dass ich interessiere mich für eine Bibliothek, die mir etwas Ähnliches zu tun erlaubt:

MultipartEntity multipart = new MultipartEntity(inputStream); 
InputStream bin = multipart.get("bin"); 

Irgendwelche Vorschläge?

Antwort

10

Beispielcode veraltet Konstruktor:

import java.io.ByteArrayInputStream; 

import org.apache.commons.fileupload.MultipartStream; 

public class MultipartTest { 

    // Lines should end with CRLF 
    public static final String MULTIPART_BODY = 
      "Content-Type: multipart/form-data; boundary=--AaB03x\r\n" 
      + "\r\n" 
      + "----AaB03x\r\n" 
      + "Content-Disposition: form-data; name=\"submit-name\"\r\n" 
      + "\r\n" 
      + "Larry\r\n" 
      + "----AaB03x\r\n" 
      + "Content-Disposition: form-data; name=\"files\"; filename=\"file1.txt\"\r\n" 
      + "Content-Type: text/plain\r\n" 
      + "\r\n" 
      + "HELLO WORLD!\r\n" 
      + "----AaB03x--\r\n"; 

    public static void main(String[] args) throws Exception { 

     byte[] boundary = "--AaB03x".getBytes(); 

     ByteArrayInputStream content = new ByteArrayInputStream(MULTIPART_BODY.getBytes()); 

     @SuppressWarnings("deprecation") 
     MultipartStream multipartStream = 
       new MultipartStream(content, boundary); 

     boolean nextPart = multipartStream.skipPreamble(); 
     while (nextPart) { 
      String header = multipartStream.readHeaders(); 
      System.out.println(""); 
      System.out.println("Headers:"); 
      System.out.println(header); 
      System.out.println("Body:"); 
      multipartStream.readBodyData(System.out); 
      System.out.println(""); 
      nextPart = multipartStream.readBoundary(); 
     } 
    } 
} 
+0

guter Code aber bis jetzt drucken Sie nur Header und Körper als String, fragt er nach etwas wie multipart.get ("bin"); – dendini

0

Beispielcode ohne veralteten Methoden zu verwenden. importieren com.google.common.net.MediaType; importieren org.apache.commons.fileupload.RequestContext;

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.nio.charset.Charset; 

public class SimpleRequestContext implements RequestContext { 
    private final Charset charset; 
    private final MediaType contentType; 
    private final byte[] content; 

    public SimpleRequestContext(Charset charset, MediaType contentType, byte[] content) { 
     this.charset = charset; 
     this.contentType = contentType; 
     this.content = content; 
    } 

    public String getCharacterEncoding() { 
     return charset.displayName(); 
    } 

    public String getContentType() { 
     return contentType.toString(); 
    } 

    @Deprecated 
    public int getContentLength() { 
     return content.length; 
    } 

    public InputStream getInputStream() throws IOException { 
     return new ByteArrayInputStream(content); 
    } 
} 

{ 
    ... 
    Charset encoding = UTF_8; 
    RequestContext requestContext = new SimpleRequestContext(encoding, contentType, body.getBytes()); 
    FileUploadBase fileUploadBase = new PortletFileUpload(); 
    FileItemFactory fileItemFactory = new DiskFileItemFactory(); 
    fileUploadBase.setFileItemFactory(fileItemFactory); 
    fileUploadBase.setHeaderEncoding(encoding.displayName()); 
    List<FileItem> fileItems = fileUploadBase.parseRequest(requestContext); 
    ... 
}