2012-11-19 14 views
7

La risposta a un tipo di richiesta HTTP mando è un/form-data multipart sembra qualcosa di simile:Biblioteca ed esempi di analisi multipart/form-data da 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 

ho usato Apache per inviare e ricevere le richieste HTTP, ma non riesco a trovare un modo semplice per usarlo per analizzare quanto sopra per un facile accesso ai campi del modulo.

io preferirei non reinventare la ruota, quindi sto cercando una libreria che mi permette di fare qualcosa di simile a:

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

Qualche suggerimento?

risposta

10

utilizzando il costruttore deprecato:

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

buon codice tuttavia finora si stampano solo intestazioni e corpo come una stringa, chiede qualcosa come multipart.get ("bin"); – dendini

0

codice di esempio senza usare metodi deprecati. 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); 
    ... 
} 
Problemi correlati