2012-12-26 31 views
6

Uygulamamdaki dosya yüklemesini uygulamak için Servlet 3 @MultiPartConfig ek notunu kullanıyorum. Çalışma zamanında çok parçalı yapılandırma konumu parametresine ihtiyacım var (annotaion parametresinde hardcode değil). Servlet'in multipart-config'ına programatik erişim için herhangi bir API var mı?Servlet 3.0'da MultiPartConfig'e programatik erişim

Teşekkür

cevap

5

@MultiPartConfig gerçekten kap için sadece bir işaretleyici arayüzüdür. Servlet başlatıldığında, sağlanan açıklama değerleri bir proxy nesnesi ile eşlenir. Gelen istek çok parçalı/form-veri olduğunda, yüklemenin bölümleri istek ile eşleştirilir ve kap, açıklamadan ve istek üzerindeki kısımlara dayanarak gerekli işi yapar. Bu süreci engellemenin bir yolu yoktur, çünkü her şey kapların bağırsaklarında gerçekleşir. Ancak, bir alternatif var. Bir dosya sistemi işlemini ikinci kez gerçekleştirmeyi gerektirir. Tüm parçalara sahip olduğunuzdan, dosyayı yeniden oluşturabilir ve seçtiğiniz konuma "yeniden yükleyebilirsiniz". Aşağıdaki yöntem gibi bir şey olabilir. Ben de senin aynı problem vardı

@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

ile bu kristal berraklığında örneği inceleyelim

bitirdiniz ve sonra bir çalışma zamanı dosya konumu gerek "yeniden yüklemeden" başka seçeneğiniz yok parçalar. –

0

ve çözüm basittir:: Ben açıkçası kod bitmedi kavramı göstermek için kendime ait bir servlet'dir hızla bu test rağmen unutmayın standart Servlet 3.0 dosya yükleme olduğunu yeterli: sadece Apache FileUpload Commons kavanozları kapmak ve size @MultiPartConfig kullanıyorsanız Hemen Akış 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

Sorun, adresi almadığınız @MultiPartConfig ve dosya yükleme hakkındaydı. Ayrıca, istekte bulunan (öğeye yüklenmiş) bir öğeden de akış yapıyorsunuz. Bu, tekrar "yeniden yükleyerek" okuduğunuz anlamına geliyor. –

+0

@Brian Reindel bu durumda değil, tekrar 'tekrar yükleme yapmıyorum', Streaming API ile yaptığım şey, geçici dosyalar olmadan veya hafızada önbelleğe alma ile isteğin doğrudan ayrıştırılmasıdır. Aslında bu, Streaming API ile avantajlıdır: Bellek verimli ve hızlı işlem, lütfen http://commons.apache.org/proper/commons-fileupload/streaming.html adresini ziyaret edin –

+0

Servlet içinde olduğunuzu varsayarsak ve bir kapsayıcı kullanarak, dosya öğesi istek üzerine nasıl geçti? Baytlar zaten belleğe yüklenir. Yüklenmekte olan içerikleri gerçek zamanlı yayınlamıyorsunuz. FileUpload üzerinden yaklaşımınızın avantajının doğru olması, bu durumda dosyanın ilk önce dosya sistemine yazılması gerektiğinden eminsiniz. Diskteki iki dosyayı yönetmenin sorunlu olduğuna katılmıyorum. Bununla birlikte, bu soru, özellikle @MultiPartConfig ek açıklamasını ve dosyanın çalışma zamanı konumunu ele almakta ve sadece genel olarak dosya yüklemesini değil. –