2016-12-15 41 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);