2012-12-26 12 views
6

Ich verwende Servlet 3 @MultiPartConfig Annotation, Dateiupload in meiner Anwendung zu implementieren. Ich brauche den Parameter location multipart-config zur Laufzeit (nicht hardcode im annotaion-Parameter). Gibt es eine API für den programmatischen Zugriff auf die Multipart-Konfiguration von Servlet?Programmatic Zugriff auf MultiPartConfig in Servlet 3.0

Dank

Antwort

5

Die @MultiPartConfig ist wirklich nur eine Markierungsschnittstelle für den Behälter. Wenn das Servlet initialisiert wird, werden die angegebenen Annotation-Werte mit einem Proxy-Objekt verknüpft. Wenn es sich bei der eingehenden Anfrage um eine Multipart-/Formulardaten handelt, werden die Teile des Uploads der Anforderung zugeordnet, und der Container führt die erforderliche Arbeit basierend auf den Werten aus der Annotation und den Teilen der Anforderung aus. Es gibt keine Möglichkeit für Sie, diesen Prozess abzufangen, da alles innerhalb der Eingeweide des Containers passiert. Es gibt jedoch eine Alternative. Dazu muss ein Dateisystemvorgang ein zweites Mal ausgeführt werden. Da Sie alle Teile haben, können Sie die Datei rekonstruieren und sie an den Ort Ihrer Wahl "erneut hochladen". Es könnte etwas wie die folgende Methode aussehen. Denken Sie daran, obwohl ich diese schnell in einem Servlet meiner eigenen getestet, das Konzept zu zeigen, ist es offensichtlich nicht Code beendet:

@Override 
protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) 
     throws ServletException, IOException { 

    httpServletResponse.setContentType("text/html"); 
    PrintWriter printWriter = httpServletResponse.getWriter(); 

    InputStream inputStream; 
    FileOutputStream fileOutputStream; 

    for (Part part : httpServletRequest.getParts()) { 

     inputStream = httpServletRequest.getPart(part.getName()).getInputStream(); 
     int i = inputStream.available(); 
     byte[] b = new byte[i]; 
     inputStream.read(b); 
     String fileName = ""; 

     for (String temp : part.getHeader("content-disposition").split(";")) { 
      if (temp.trim().startsWith("filename")) { 
       fileName = temp.substring(temp.indexOf('=') + 1).trim().replace("\"", ""); 
      } 
     } 

     String uploadDir = "/temp"; 
     fileOutputStream = new FileOutputStream(uploadDir + "/" + fileName); 
     fileOutputStream.write(b); 
     inputStream.close(); 
     fileOutputStream.close(); 

     printWriter.write("Uploaded file " + uploadDir + "/" + fileName + "."); 
    } 
} 
+0

getan Wenn Sie @MultiPartConfig verwenden und eine Runtime-Datei Standort müssen dann Sie haben keine andere Möglichkeit als "neu hochzuladen" Die Teile. –

0

ich zu Ihrem gleiches Problem hatte, und die Lösung ist einfach: Standard Servlet 3.0 Datei-Upload ist nicht genug: nur die Gläser von Apache Commons Fileupload packen und Sie

schauen Sie einfach in diesem kristallklaren Beispiel mit Streaming API

ServletFileUpload upload = new ServletFileUpload(); 

    // Parse the request 
    FileItemIterator iter = upload.getItemIterator(request); 
    while (iter.hasNext()) { 
     FileItemStream item = iter.next(); 
     String name = item.getFieldName(); 
     InputStream stream = item.openStream(); 
     if (item.isFormField() == false) 
      System.out.println("File field " + name + " with file name " 
      + item.getName() + " detected."); 
      FileOutputStream fos = new FileOutputStream("your_location"); 
      Streams.copy (stream, fos, true); 

     } 
    } 
+0

Die Frage war über @MultiPartConfig und Datei-Upload, die Sie nicht angesprochen haben. Sie streamen auch von einem Gegenstand, der bereits auf der Anfrage steht (hochgeladen im Speicher), und das bedeutet, dass Sie ihn einfach "erneut hochladen" lesen. –

+0

@Brian Reindel das ist nicht der Fall, ich bin nicht 'wieder hochzuladen', mit der Streaming-API, was ich tue, ist eine direkte Analyse der Anfrage ohne temporäre Dateien oder Zwischenspeicherung im Speicher. In der Tat ist das der Vorteil der Streaming API: Speichereffizienz und schnellere Verarbeitung, bitte überprüfen Sie http://commons.apache.org/proper/commons-fileupload/streaming.html –

+0

Angenommen, Sie sind in einem Servlet und verwenden einen Container, Wie ist die Datei auf die Anfrage gekommen? Die Bytes sind bereits im Speicher geladen. Sie streamen die Inhalte nicht in Echtzeit, während sie hochgeladen werden. Sie haben Recht, dass der Vorteil Ihres Ansatzes gegenüber FileUpload darin liegt, dass in diesem Fall die Datei zuerst in das Dateisystem geschrieben werden muss. Ich bin nicht anderer Meinung, dass das Verwalten von zwei Dateien auf der Festplatte problematisch ist. Die Frage bezog sich jedoch speziell auf die Annotation @MultiPartConfig und den Laufzeitort der Datei und nicht einfach auf den Dateiupload im Allgemeinen. –

Verwandte Themen