2012-10-24 6 views
6

Carica il file che sfoglio con input type="file" nella mia app Web. Il problema è ho la dimensione FileItem lista come 0 se posso vedere tutte le informazioni del file caricato inCaricamento file con parseRequest di ServletFileUpload?

request ->JakartaMutltiPartRequest -> File di attributi

Ecco il codice Java che legge il file

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:

Ecco JSP parte:

+0

inserisci il tuo jsp qui –

+0

Qual è il codice del modulo HTML? –

+0

Pubblicato anche il codice jsp/html –

risposta

11

Come ho già detto in un commento alla stessa domanda, che hai postato in precedenza, è molto probabile perché hai già analizzato la richiesta. I file fanno parte del corpo della richiesta e possono essere analizzati solo una volta.

Aggiornamento:

faccio di solito usare commons-caricati in questo modo:

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

Ma non ho analizzato la richiesta in precedenza –

+0

Puoi mostrare il resto del tuo codice servlet che fa qualcosa con HttpServletRequest prima che venga chiamato parseRequestStreamWithApache()? –

+0

Ho inserito il codice nel primo filtro della mia webapp, sempre lo stesso risultato. Sembra che questo non sia il problema –

0

Quanto sono grandi i file che si sta caricando? Potresti essere sopra la soglia predefinita. Credo che il valore predefinito è 10K

factory.setSizeThreshold(maxSizeYouWantToHandle); 
+0

La soglia imposta il limite su quale dimensione i dati verranno mantenuti in memoria, se la soglia (l'impostazione predefinita di 10K è corretta) viene passata, i dati verranno archiviati su disco. In java.io.tempdir per impostazione predefinita. –

3

Si dovrebbe verificare la presenza di contenuto multipart

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 evalue true –

+0

@MSach sembra che l'url di azione abbia collisioni con il filtro degli struts. Se stai usando puntoni, perché non usi la sua funzione di fileupload? Pubblica web.xml e rimuovi tutto tranne la configurazione del servlet. –

0

Se si utilizza WebLogic 12 quindi verificare se il patch_wls1211 è insatlled o meno. Stavo avendo lo stesso problema e si è risolto dopo l'applicazione di patch_wls1211.