2012-03-29 10 views
0

Ich versuche, das Liferay Web Form-Portlet anzupassen, um Datei-Upload zu akzeptieren, und ich habe so ziemlich alles funktioniert, außer das Anhängen der Datei an die zu sendende E-Mail.Problem mit Commons-Fileupload und Liferay

Erste Felder aus der Form:

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

Und dann der Konstruktion und das Senden der E-Mail:

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

} 

erhalte ich die folgende Konsole Fehler beim Versuch, einen Datei-Upload zu verarbeiten und befestigen die Datei an die Nachricht:

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) 

muss ich meine DiskFileItemFactory richtig konfiguriert? Was könnte ich falsch machen?

Danke.

Antwort

0

Es scheint, dass das MailServiceUtil-Subsystem einen Thread abspinnt, um das eigentliche Senden der E-Mail zu tun, und nicht darauf wartet, dass es zurückkehrt (daher Thread). Nach dem Aufruf von MailServiceUtil.sendEmail() löschte ich sofort die anzuhängende Datei, BEVOR sie tatsächlich gesendet werden konnte!

Ich werde in eine Art von Wrapper für die MailServiceUtil suchen, die ich das Dateiobjekt übergeben kann und dann, sobald es tatsächlich das Löschen gesendet wird.

0

können Sie versuchen, mit MailEngine.send Methode

send ( INTERNET aus, INTERNET [] auf, INTERNET [] cc, INTERNET [] bcc, INTERNET [] bulkAddresses, String Thema, String Körper, boolean htmlFormat, INTERNET [] replyTo, String messageId, String inReplyTo, Datei [] Attachments)

ich bin nicht sicher, ob MailEngineUtil.sendEmail auch funktioniert, wenn Sie das Problem aussortieren, wie Sie bereits entdeckt seine Sende ein Bus und dann ein Zuhörer d wird aufgerufen (ich denke, seine MailMessageListener), die Anlage nicht lesen, auch wenn Sie es in MailMessage hinzufügen.