5

Bietet Apache Commons File Upload-Paket eine generische Schnittstelle zu parsen multipart/form-data Brocken über InputStream, Anhängen Array<Byte>, oder über eine andere generische Streaming-Schnittstelle?Parsen Multipart/Formulardaten mit Apache Commons Datei Upload

Ich weiß, dass sie eine Streaming-API haben, aber das Beispiel zeigt nur, wie man das über ServletFileUpload macht, was meiner Meinung nach spezifisch für Servlet sein muss.

Wenn nicht, gibt es noch andere alternative Frameworks in JVM, mit denen Sie genau dies tun können? Leider scheint der Rahmen, den ich benutze, Spray.io, keinen Weg zu bieten, dies zu tun.

+0

Welche Input haben Sie? Oder wie bekommst du es? Apache Commons File Upload hat einen [FileUploadBase.getItemIterator (RequestContext)] (http://commons.apache.org/proper/commons-fileupload/apidocs/org/apache/commons/fileupload/FileUploadBase.html#getItemIterator (org.apache .commons.fileupload.RequestContext)), die Sie möglicherweise verwenden können – JoseM

+0

Haben Sie dieses Beispiel aus der spray.io Bibliothek gesehen? https://github.com/spray/spray/blob/master/examples/spray-can/simple-http-server/src/main/scala/spray/examples/FileUploadHandler.scala – JoseM

+0

Ich werde die Eingabe in Chunks erhalten von Array , also idealerweise würde ich diese Bytes dem Stream-Parser zuführen wollen. Die von Ihnen erwähnte Funktion nimmt jedoch einen RequestContext, dessen Unterklasse nur ServletRequestContext und PortletRequestContext ist. Nicht allgemein genug für mich. – lolski

Antwort

3

bayou.io hat eine generische MultipartParser

Sie könnten einige Adapter müssen mit ihm arbeiten, da sie ihre eigenen Async und ByteSource Schnittstellen.

Das folgende Beispiel zeigt, wie der Parser verwenden synchron mit InputStream

String msg = "" 
     //+ "preamble\r\n" 
     +"--boundary\r\n" 
     +"Head1: Value1\r\n" 
     +"Head2: Value2\r\n" 
     +"\r\n" 
     +"body.body.body.body." 

     +"\r\n--boundary\r\n" 
     +"Head1: Value1\r\n" 
     +"Head2: Value2\r\n" 
     +"\r\n" 
     +"body.body.body.body." 

     +"\r\n--boundary--" 
     + "epilogue"; 

    InputStream is = new ByteArrayInputStream(msg.getBytes("ISO-8859-1")); 
    ByteSource byteSource = new InputStream2ByteSource(is, 1024); 
    MultipartParser parser = new MultipartParser(byteSource, "boundary"); 
    while(true) 
    { 
     try 
     { 
      MultipartPart part = parser.getNextPart().sync(); // async -> sync 
      System.out.println("== part =="); 
      System.out.println(part.headers()); 
      ByteSource body = part.body(); 
      InputStream stream = new ByteSource2InputStream(body, Duration.ofSeconds(1)); 
      drain(stream); 
     } 
     catch (End end) // control exception from getNextPart() 
     { 
      System.out.println("== end of parts =="); 
      break; 
     } 
    } 
+0

mailen Sie mir, wenn Sie Fragen haben. – ZhongYu