2010-08-10 30 views
2

我在写一个servlet,它从客户端接收xml文件并使用它。Servlet:从servletinputstream切割上传头

我的问题是,在servletinputstream(我用得到:request.getInputStream())是在开始和结束时的一些载信息:

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

<XML-Content> 

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

是否有一个聪明的解决方案,以削减远离servletinputstream的那些线?

问候

回答

1

这是一个multipart/form-data报头(如在RFC2388指定)。抓取一个完整的multipart/form-data解析器,而不是重新创建自己的。 Apache Commons FileUpload是该工作的事实标准API。删除所需的JAR文件/WEB-INF/lib,然后它会是那么容易,因为:

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); 
    } 

    // ... 
} 

再次,不要重新发明自己。你真的不想维护后果。

0

如果你的问题是,你想读的流媒体文件(性能),检查此链接 http://commons.apache.org/proper/commons-fileupload/streaming.html

(从链接):

// 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 
     ... 
    } 
}