2012-10-24 11 views
6

Przesyłam plik, który przeglądam za pomocą input type="file" w mojej aplikacji internetowej. Problem jest uzyskać rozmiar FileItem listy jako 0, choć widzę wszystkie przesłane informacje o pliku podPrzesyłanie plików za pomocą parametru parseRequest ServletFileUpload?

request ->JakartaMutltiPartRequest -> Pliki przypisują

Oto kod Java, który odczytuje plik

public InputStream parseRequestStreamWithApache(HttpServletRequest request) 
    throws FileUploadException, IOException { 
    InputStream is = null; 
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    List items = upload.parseRequest(request); 
    // here the item size is 0 ,i am not sure why i am not getting my file upload in browser with type="file" 
    // but If inspect request in debugger i can see my file realted info in request--->JakartaMutltiPartRequest----->files attribute 
    Iterator iter = items.iterator(); 
    while (iter.hasNext()) { 
    FileItem item = (FileItem) iter.next(); 

    if (!item.isFormField()) { 
     is = item.getInputStream(); 
    } 
    } 

    return is; 
} 

EDIT:

Oto JSP część:

<form NAME="form1" action="customer/customerManager!parseRequestStreamWithApache.action" ENCTYPE="multipart/form-data" method="post" > 
    <TABLE > 
     <tr> 
       <th>Upload File</th> 
        <td> 
        <input name="fileUploadAttr" id="filePath" type="file" value=""> 
       </td> 
        <td > 
       <Input type="submit" value ="uploadFile"/> 
        </td> 
      </tr> 
    </TABLE> 
</form> 
+0

opublikuj swój jsp tutaj –

+0

Jaki jest twój kod HTML? –

+0

Przesłał też kod jsp/html –

Odpowiedz

11

Jak już wspomniałem w komentarzu do tego samego pytania, które napisałeś wcześniej, jest to najprawdopodobniej dlatego, że wcześniej przeanalizowałeś żądanie. Pliki są częścią treści żądania i można je analizować tylko raz.

Aktualizacja:

zwykle zrobić używać commons przesłać w ten sposób:

if (ServletFileUpload.isMultipartContent(request)) { 
    ServletFileUpload fileUpload = new ServletFileUpload(); 
    FileItemIterator items = fileUpload.getItemIterator(request); 
    // iterate items 
    while (items.hasNext()) { 
     FileItemStream item = items.next(); 
     if (!item.isFormField()) { 
      is = item.openStream(); 
     } 
    } 
} 
+0

Ale nie przeanalizowałem wcześniej żądania –

+0

Czy możesz pokazać resztę swojego kodu serwletu, który robi cokolwiek z twoim HttpServletRequest zanim wywołana zostanie funkcja parseRequestStreamWithApache()? –

+0

Umieściłem kod w pierwszym filtrze mojej aplikacji webowej, wciąż ten sam wynik. Wygląda na to, że to nie jest problem. –

0

Jak duże są pliki, które są przesłaniem? Możesz przekroczyć domyślny próg. Myślę domyślnie 10K

factory.setSizeThreshold(maxSizeYouWantToHandle); 
+0

Próg ustawia limit, do jakiego rozmiaru dane będą przechowywane w pamięci, jeśli próg (domyślny 10K jest poprawny) zostanie przekazany, dane zostaną zapisane na dysku. Domyślnie w java.io.tempdir. –

3

Należy sprawdzić wieloczęściowy zawartości

boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

if (isMultipart) { 
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 

    try { 
     List items = upload.parseRequest(request); 
     Iterator iterator = items.iterator(); 
     while (iterator.hasNext()) { 
      FileItem item = (FileItem) iterator.next(); 
      if (!item.isFormField()) { 
       String fileName = item.getName(); 

       String root = getServletContext().getRealPath("/"); 
       File path = new File(root + "/fileuploads"); 
       if (!path.exists()) { 
        boolean status = path.mkdirs(); 
       } 

       File uploadedFile = new File(path + "/" + fileName); 
       item.write(uploadedFile); 
      } 
     } 
    } catch (Exception e) { 
+0

isMultipart content evalues ​​to true –

+0

@MSach wydaje się, że adres URL akcji ma kolizje z filtrem rozporek. Jeśli używasz podpórek, dlaczego nie używasz funkcji ładowania plików? Opublikuj plik web.xml i usuń wszystko oprócz konfiguracji serwletu. –

0

Jeśli używasz WebLogic 12 a następnie sprawdzić, czy patch_wls1211 jest insatlled czy nie. Miałem ten sam problem i został rozwiązany po zastosowaniu poprawki patch_wls1211.