2012-11-19 31 views
7
से पार्स करने बहुखण्डीय/फार्म-डेटा का उदाहरण

HTTP अनुरोध मैं भेज एक प्रकार की प्रतिक्रिया एक बहुखण्डीय/फार्म-डेटा तरह दिखता है:पुस्तकालय और 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 

मैं करने के लिए अपाचे का उपयोग कर HTTP अनुरोध भेजें और प्राप्त करें, लेकिन मुझे फॉर्म फ़ील्ड की आसान पहुंच के लिए उपरोक्त पार्स करने के लिए इसका उपयोग करने का एक आसान तरीका नहीं दिख रहा है।

मैं पहिया बदलने की नहीं करना पसंद करेंगे, तो मैं एक पुस्तकालय है कि मेरे पास कुछ इसी तरह करने की अनुमति देता के लिए देख रहा हूँ:

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

कोई सुझाव?

उत्तर

3

Apache Commons File Upload

देखें आप वसंत MVC का उपयोग कर रहे हैं, तो इस http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch16s08.html

+0

यह वही था जो मुझे चाहिए था। इसे काम करने में कुछ समय लगा लेकिन ऐसा इसलिए था क्योंकि मुझे भेजा गया मल्टीपार्ट/फॉर्म-डेटा वास्तव में खराब था! – Linus

10

उदाहरण कोड पदावनत निर्माता का उपयोग कर देखें: पदावनत तरीकों का उपयोग कर के बिना

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

अच्छा कोड हालांकि अब तक आप केवल स्ट्रिंग के रूप में हेडर और बॉडी प्रिंट करते हैं, वह multipart.get ("bin") जैसे कुछ मांगता है; – dendini

0

उदाहरण कोड। आयात com.google.common.net.MediaType; आयात 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); 
    ... 
}