2012-11-19 7 views
7

Odpowiedzią na jednym rodzaju żądania HTTP wysyłam to wieloczęściowy/form-data wyglądał:biblioteki i przykłady parsowania multipart/form-data z InputStream

--------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 

Używam Apache wysyłać i odbierać żądania HTTP, ale nie mogę znaleźć łatwego sposobu użycia go do przeanalizowania powyższego dla łatwego dostępu do pól formularza.

wolałbym, aby nie wyważać otwartych drzwi, więc szukam dla biblioteki, która pozwala mi robić coś podobnego do:

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

jakieś sugestie?

Odpowiedz

10

Przykład kodu przy użyciu przestarzałej konstruktora:

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

dobry kod, jednak do tej pory drukujesz tylko nagłówki i ciało jako ciąg, pyta o coś takiego jak multart.get ("bin"); – dendini

0

Przykład kodu bez użycia przestarzałe metody. import com.google.common.net.MediaType; import 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); 
    ... 
}