2010-08-10 9 views
2

J'écris une servlet qui reçoit un fichier xml du client et fonctionne avec.Servlet: couper l'en-tête de téléchargement du servletinputstream

Mon problème est que dans le ServletInputStream (que je reçois avec: request.getInputStream()) quelques informations de téléchargement au début et à la fin:

-----------------------------186292285129788 
Content-Disposition: form-data; name="myFile"; filename="TASKDATA - Kopie.XML" 
Content-Type: text/xml 

<XML-Content> 

-----------------------------186292285129788-- 

Y at-il une solution intelligente pour couper ces lignes à l'écart du servletinputstream?

salutations

Répondre

1

C'est un en-tête multipart/form-data (comme spécifié dans RFC2388). Prenez un analyseur complet multipart/form-data plutôt que de réinventer le vôtre. Apache Commons FileUpload est l'API standard de facto pour le travail. Laissez tomber les fichiers JAR requis dans /WEB-INF/lib puis ce sera aussi facile que:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    try { 
     List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
     for (FileItem item : items) { 
      if (item.isFormField()) { 
       // Process regular form field (input type="text|radio|checkbox|etc", select, etc). 
       String fieldname = item.getFieldName(); 
       String fieldvalue = item.getString(); 
       // ... (do your job here) 
      } else { 
       // Process form file field (input type="file"). 
       String fieldname = item.getFieldName(); 
       String filename = FilenameUtils.getName(item.getName()); 
       InputStream filecontent = item.getInputStream(); 
       // ... (do your job here) 
      } 
     } 
    } catch (FileUploadException e) { 
     throw new ServletException("Cannot parse multipart request.", e); 
    } 

    // ... 
} 

Encore une fois, ne réinventez pas votre propre. Vous ne voulez vraiment pas avoir de conséquences après la maintenance.

0

Si votre problème est que vous voulez lire votre fichier en streaming (pour les performances), vérifiez ce lien http://commons.apache.org/proper/commons-fileupload/streaming.html

(À partir du lien):

// Check that we have a file upload request 
boolean isMultipart = ServletFileUpload.isMultipartContent(request); 

// Create a new file upload handler 
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.getInputStream(); 
    if (item.isFormField()) { 
     System.out.println("Form field " + name + " with value " 
      + Streams.asString(stream) + " detected."); 
    } else { 
     System.out.println("File field " + name + " with file name " 
      + item.getName() + " detected."); 
     // Process the input stream 
     ... 
    } 
}