2012-03-29 111 views
0

我试图自定义Liferay Web Form portlet来接受文件上传,并且除了将文件附加到要发送的电子邮件之外,我几乎可以完成所有工作。commons-fileupload和Liferay的问题

从表单中获取字段:

public void saveData(ActionRequest actionRequest, ActionResponse actionResponse) { 

... 

File uploadedFile = null; 

... 

Map<String,String> fieldsMap = new LinkedHashMap<String,String>(); 

// Create a FileItemFactory for disk-based file items 
DiskFileItemFactory factory = new DiskFileItemFactory(1073741824, new File("/temp")); 

// Create a new file upload handler 
PortletFileUpload upload = new PortletFileUpload(factory); 
upload.setSizeMax(67108864); 

// Parse the request 
List<FileItem> items = upload.parseRequest(actionRequest); 

int i = 1; 

Iterator iter = items.iterator(); 

// Throw away the hidden field, don't need it 
FileItem dud = (FileItem)iter.next(); 

while (iter.hasNext()) { 

    FileItem item = (FileItem)iter.next(); 

    String fieldLabel = preferences.getValue(
     "fieldLabel" + i, StringPool.BLANK); 

    String fieldType = preferences.getValue(
      "fieldType" + i, StringPool.BLANK); 

    if (Validator.isNull(fieldLabel)) { 
     break; 
    } 

    if(!fieldType.equals("file")) { 
     String fieldValue = item.getString(); 
     fieldsMap.put(fieldLabel, fieldValue); 
    } else { 
     String fieldName = item.getName(); 
     uploadedFile = new File(fieldName); 
     item.write(uploadedFile); 
    } 
     i++; 
} 
... 

    if(sendAsEmail) { 
     emailSuccess = sendEmail(fieldsMap, preferences, uploadedFile); 
    } 
} 

然后建设和电子邮件的发送:

protected boolean sendEmail(Map<String, String> fieldsMap, PortletPreferences preferences, File uploadedFile) { 

    MailMessage mailMessage = new MailMessage(fromAddress, toAddress, subject, body, false); 

    if(uploadedFile != null) { // i.e., there was 'file' field up above 
     mailMessage.addAttachment(uploadedFile); 
    } 

    MailServiceUtil.sendEmail(mailMessage); 


    if(uploadedFile != null) { 
     uploadedFile.delete(); 
    } 

} 

我得到试图处理文件上传,并附上时,下面的控制台错误文件到邮件:

16:09:49,597 ERROR [MailEngine:489] IOException while sending message 
16:09:49,598 ERROR [MailEngine:154] java.io.FileNotFoundException: helpdesk_.png (No such file or directory) 

我有我的DiskFileItemFactory配置是否正确?我可能做错了什么?

谢谢。

回答

0

看来MailServiceUtil子系统会脱离一个线程来执行电子邮件的实际发送,并且不会等待它返回(因此,线程)。因此,在MailServiceUtil.sendEmail()调用之后,我立即删除了要附加的文件,然后才真正有机会发送!

我打算查看一下MailServiceUtil的一些封装类型,我可以将该文件对象传入,然后一旦其实际发送完成删除。

0

你可以尝试使用MailEngine.send方法

发送( 网际地址来自网际地址[]于网际地址[] CC, 网际地址[] BCC,网际地址[] bulkAddresses, 字符串主题,绳体,布尔htmlFormat, 网际地址[]的replyTo,字符串MESSAGEID,字符串inReplyTo, 文件[]附件)

我不知道,如果你理清问题,因为你已经发现了它发送给MailEngineUtil.sendEmail会甚至工作一辆公共汽车,然后是一个听众d被调用(我认为它的MailMessageListener),即使您将它添加到mailMessage中,它也不会读取附件。