2014-03-30 71 views
2

我正在尝试使用Mandrill Wrapper for Java在电子邮件中附加文件。这是我正在处理附件文件的一段代码。Mandrill/Java - 连接文件损坏

public byte[] attachmentContent(String filepath) 
{ 
    Path path = Paths.get(filepath); 
    byte[] data = null; 
    try { 
     data = Files.readAllBytes(path); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return data; 
} 

    //adding attachment 
    ArrayList<MandrillAttachment> attachedFiles = new ArrayList<MandrillAttachment>(); 
    //file 1 
    String attType = "application/pdf"; 
    String attName = "Indian License.pdf"; 
    String attContent = Base64.encodeBase64URLSafeString(attachmentContent("C:\\LL Indian License.pdf")); 
    System.out.println(attContent); 
    //attach 
    attachedFiles.add(new MandrillAttachment(attType, attName, attContent)); 
    message.setAttachments(attachedFiles); 

但是,该文件通过发送进程损坏。任何想法如何解决这个问题?

+0

您如何知道文件已损坏?你能举个例子吗? – klarki

+0

我正在使用一个炒作pdf文件(这意味着,我可以打开并阅读它)。但是,在我通过电子邮件发送后,使用我写的代码,我无法打开PDF文件。当我尝试打开时,它说文件“损坏” – aeros

+0

是的,但它看起来如何?也许它与base64两次编码...你可以发布一个片段? – klarki

回答

1

(这可能来不及回答)使用适当的Base64编码来避免此问题。我使用下面的代码来解决这个问题。

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 
import org.apache.commons.codec.binary.Base64; 

List<MessageContent> listofAttachments = new ArrayList<MessageContent>(); 
    MessageContent attachment = new MessageContent(); 
    attachment.setType("application/pdf"); 
    attachment.setName("Test.pdf"); 

    File file = new File("C:\\Users\\xxx\\PdfTesting\\Test.pdf"); 

    InputStream is = new FileInputStream(file); 

    long length = file.length(); 
    if (length > Integer.MAX_VALUE) { 
     // File is too large 
    } 
    byte[] bytes = new byte[(int) length]; 

    int offset = 0; 
    int numRead = 0; 
    while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { 
     offset += numRead; 
    } 

    if (offset < bytes.length) { 
     throw new IOException("Could not completely read file " + file.getName()); 
    } 

    is.close(); 
    byte[] encoded = Base64.encodeBase64(bytes); 
    String encodedString = new String(encoded); 
    attachment.setContent(encodedString); 
+0

嗯,我无法解决类MessageContent。它从何而来?找不到任何地方。 – pidabrow

+0

MessageContent是Mandrill库中的一个类。 – Jeeri