首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >commons-fileupload和Liferay带来的麻烦

commons-fileupload和Liferay带来的麻烦
EN

Stack Overflow用户
提问于 2012-03-30 00:26:07
回答 2查看 955关注 0票数 0

我正在尝试定制Liferay Web Form portlet以接受文件上传,除了将文件附加到要发送的电子邮件之外,我已经完成了几乎所有的工作。

从表单中获取字段:

代码语言:javascript
复制
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);
     }
}

然后是邮件的构造和发送:

代码语言:javascript
复制
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();
    }

}

尝试处理文件上传并将文件附加到消息时,我收到以下控制台错误:

代码语言:javascript
复制
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配置是否正确?我能做错什么呢?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-30 03:37:16

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

我将研究某种类型的MailServiceUtil包装器,我可以将文件对象传递给它,然后一旦它实际发送,就执行删除操作。

票数 1
EN

Stack Overflow用户

发布于 2012-03-30 17:09:24

您可以尝试使用MailEngine.send方法吗

send( InternetAddress from,InternetAddress[] to,InternetAddress[] cc,InternetAddress[] bcc,InternetAddress[] bulkAddresses,String subject,String body,boolean htmlFormat,InternetAddress[] replyTo,String messageId,String inReplyTo,File[] attachments)

即使你解决了这个问题,我也不确定MailEngineUtil.sendEmail是否会工作,因为你已经发现它会发送到总线上,然后一个监听器会被调用(我想是它的MailMessageListener),即使你把它添加到mailMessage中,它也不会读取attachement。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9929466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档