2016-12-15 27 views
1

附件我使用Oreilly MultipartRequest servlet來解析形式的multipart/form-data的請求,像這樣:的Java:發送電子郵件使用奧賴利MultipartRequest的servlet

String path = getServletContext().getRealPath("/tmp"); 
List uploadFiles = new ArrayList(); 
MultipartRequest multi = new MultipartRequest(request, path, 50 * 1024 * 1024, "UTF-8"); 
Enumeration<String> params = multi.getParameterNames(); 
Enumeration<String> files = multi.getFileNames(); 
//retrieve text parameters 
String param; 
while(params .hasMoreElements()){ 
    param = params .nextElement(); 
    for(String occurence : multi.getParameterValues(param)){ 
     pageContext.setAttribute(param, occurence); 
    } 
} 
//get files 
String fileParam; 
while(files.hasMoreElements()){ 
    fileParam = files.nextElement(); 
     uploadFiles.add(multi.getFile(fileParam)); 
} 

我能夠得到的所有數據,但在文件的問候,我想把它們作爲附件發送,通常這是因爲這樣做(通過解析request

 ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory()); 
     try { 
      List fileItemsList = servletFileUpload.parseRequest(request); 
      Iterator it = fileItemsList.iterator(); 
      while (it.hasNext()){ 
       FileItem fileItem = (FileItem)it.next(); 
       if (fileItem.isFormField()){ 
        messageBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(fileItem.getString()); 
        messageBodyPart.setDataHandler(new DataHandler(source)); 
        messageBodyPart.setFileName(fileItem.getFieldName()); 
        multipart.addBodyPart(messageBodyPart); 
       } 
      } 
     } catch(Exception e) { 
      out.println(e.toString()); 
     } 

相反,我創建的所有文件uploadFiles列表上傳。問題是附件使用FileItem接口,它允許我使用getString()獲取文件項目的內容作爲字符串,而Oreilly MultipartRequest僅將該文件作爲File對象返回。我怎樣才能使用File Object的內容,或者將它轉換成FileItem對象。

+0

http://stackoverflow.com/q/2422468 – BalusC

回答

1

根據文檔,FileItem.getString()返回「作爲字符串文件項目的內容」。但是FileDataSource(String)「從指定的路徑名​​創建一個FileDataSource」。所以在你的第二個代碼片段中,你傳遞一個文件內容作爲一個String(誰知道二進制文件將做什麼)而不是文件名。 getFieldName()將返回表單字段的名稱,而不是上傳文件的名稱(這是您想要的)。

如果您使用MultipartRequest處理上載,那麼從MultipartRequest返回的File對象實例化DataHandler所需的FileDataSource並不重要。

如果你處理與ServletFileUpload上傳則可能是最好的就是創建DataSource接口,你自己定製的實現,它允許的FileItem在構造

public class FileItemDataSource implements DataSource { 

    private FileItem item; 

    public FileItemDataSource(FileItem item) { 
     this.item = item; 
    } 

    @Override 
    public String getContentType() { 
     return item.getContentType() ; 
    } 

    @Override 
    public InputStream getInputStream() throws IOException { 
     return item.getInputStream(); 
    } 

    @Override 
    public String getName() { 
     return item.getName(); 
    } 

    @Override 
    public OutputStream getOutputStream() throws IOException { 
     return item.getOutputStream(); 
    } 
} 

這樣的類,你可以做

DataSource source = new FileItemDataSource(fileItem); 
messageBodyPart.setDataHandler(new DataHandler(source)); 
messageBodyPart.setFileName(fileItem.getName()); 
multipart.addBodyPart(messageBodyPart); 
0

顯然FileDataSource類接受FileString它的構造函數。所以直接傳遞File對象只是解決了這個問題。作爲這樣:

File fileItem = (File)it.next(); 
    DataSource source = new FileDataSource(fileItem); 
相關問題