2012-12-26 15 views
6

Używam adnotacji Servlet 3 @MultiPartConfig do implementacji przesyłania plików w mojej aplikacji. Potrzebuję ustawić parametr lokalizacji multipart config w środowisku wykonawczym (nie parametr hardcode in annotaion). Czy istnieje jakiś API do programowego dostępu do multipart-config serwletu?Programowy dostęp do MultiPartConfig w Servlet 3.0

Dzięki

Odpowiedz

5

The @MultiPartConfig jest naprawdę tylko interfejs markerem pojemnika. Po zainicjowaniu serwletu podane wartości adnotacji są mapowane do niego za pomocą obiektu proxy. Gdy żądanie przychodzące jest wieloczęściowe/dane formularza, części wysyłania są odwzorowywane na żądanie, a kontener wykonuje niezbędne prace na podstawie wartości z adnotacji i części na żądanie. Nie ma sposobu, aby przechwycić ten proces, ponieważ wszystko dzieje się w głębi pojemnika. Istnieje jednak jedna alternatywa. Wymaga to wykonania operacji systemu plików po raz drugi. Ponieważ masz wszystkie części, możesz zrekonstruować plik i "przesłać" go do wybranej lokalizacji. Może wyglądać jak poniższa metoda. Należy pamiętać, chociaż ja testowałem to szybko w serwletu mojego własnego wykazać pojęcie to nie jest oczywiście zakończył Kod:

@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

Jeśli używasz @MultiPartConfig i potrzebują lokalizację pliku wykonawczego następnie nie masz innej możliwości niż "ponowne przesłanie" części. –

0

miałem swój sam problem zbyt, a rozwiązanie jest proste: standard Servlet 3.0 upload plików jest nie wystarczy: wystarczy chwycić słoiki z Apache Commons FileUpload i skończysz

wystarczy spojrzeć na ten przykład z krystalicznie czystej 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

Pytanie dotyczyło @MultiPartConfig i przesyłania pliku, którego nie adresowałeś. Przesyłasz też strumieniowo z elementu już na żądanie (przesłanego do pamięci), co oznacza, że ​​po prostu czytasz go ponownie "przesyłając". –

+0

@Brian Reindel, tak nie jest, nie "ponownie przesyłam", dzię ki interfejsowi Streaming API można bezpoś rednio analizować żĘ ... danie bez tymczasowych plików lub buforowania w pamię ci. W rzeczywistości jest to zaleta w Streaming API: wydajne i szybkie przetwarzanie pamięci, sprawdź http://commons.apache.org/proper/commons-fileupload/streaming.html –

+0

Zakładając, że jesteś w Servletie i korzystasz z kontenera, w jaki sposób element pliku dostaje się na żądanie? Bajty są już załadowane do pamięci. Nie przesyłasz treści strumieniowo w czasie rzeczywistym, gdy są one przesyłane. Masz rację, że zaletą twojego podejścia do FileUpload jest to, że najpierw plik musi zostać zapisany w systemie plików. Nie zgadzam się z tym, że konieczność zarządzania dwoma plikami na dysku jest problematyczna. Jednak pytanie dotyczyło w szczególności adnotacji @MultiPartConfig i lokalizacji pliku, a nie zwykłego przesyłania plików. –

Powiązane problemy