Envoyer un email avec pièce jointe qui contient byte[] via java mail
J'ai suivantes byte[]
qui vient de la base de données.
0x255044462D312E330A25AAABAC
Note: au-dessus de tableau d'octets est l'exemple complet de fichier n'est pas ici à cause de la longueur.
Mise à JOUR:
Mais je suis comme [B@7ffd10fa
format
- Avant de voir le code, veuillez lire ici:
Lorsque j'envoie bytes
qui renvoie getPdfByteStream()
méthode qu'il envoie dans la pièce jointe d'e-mail comme le fichier d'origine. Mais quand je reçois à partir de la base de données et l'envoyer envoie le fichier corrompu.
Mise à JOUR:
Entity.class
@Lob
@Column(name = "ATTACHED_FILE")
private byte[] attachedFile;
//getter()/setter();
Code qui envoie un email
try {
MimeBodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText(content);
//byte[] bytes = getPDFByteStream(); //Returns byte[] reading local drive file
**UPDATE:**
//bytes[] bytes=entity.getAttachedFile(); //It gets value from entity.
/**
** It is getting like "[B@7ffd10fa" format but m storing on database like "0x255044462D312E330A25" format
**/
String string="0x255044462D312E330A25";
byte[] bytes =string.getBytes(Charset.forName("UTF-8"));
System.out.println("bytes " + bytes.toString());
DataSource dataSource = new ByteArrayDataSource(bytes, "application/pdf");
MimeBodyPart pdfBodyPart = new MimeBodyPart();
pdfBodyPart.setDataHandler(new DataHandler(dataSource));
pdfBodyPart.setFileName("bankAdminReport.pdf");
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(textBodyPart);
mimeMultipart.addBodyPart(pdfBodyPart);
InternetAddress iaSender = new InternetAddress(sender);
InternetAddress iaRecipient = new InternetAddress(recipient);
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setSender(iaSender);
mimeMessage.setSubject(subject);
mimeMessage.setRecipient(Message.RecipientType.TO, iaRecipient);
mimeMessage.setContent(mimeMultipart);
Transport.send(mimeMessage);
} catch (Exception ex) {
ex.printStackTrace();
}
getPDFByteStream() la méthode
public static byte[] getPDFByteStream() throws IOException {
File file = new File("C:\\pdf\\bankAdminReport.pdf");
byte[] b = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(b);
} catch (FileNotFoundException e) {
System.out.println("File Not Found.");
e.printStackTrace();
} catch (IOException e1) {
System.out.println("Error Reading The File.");
e1.printStackTrace();
}
return b;
}
Quelqu'un peut-il me guider.
Le principal problème est que lorsque j'envoie un fichier de lecture à partir du disque local il envoie à la perfection. mais si j'envoie obtenir à partir de la base de données ou de toute variable locale fichier corrompt.
S'il vous plaît commentaire ci-dessous si vous avez des questions au sujet de la question.
Merci.
Merci @OkieOth j'ai vu ce stackoverflow.com/questions/18571223/... . Vous pouvez également prendre de référence.
idée stupide, mais ne pas le "0x"-préfixe être supprimé de votre chaîne?
Voulez-vous dire
255044462D312E330A25
au lieu de 0x255044462D312E330A25
?. @injecteerPouvez-vous faire un
Arrays.equals(bytesFromDb, bytesFromPdf)
juste pour s'assurer que vous obtenez en fait le même tableau d'octets à partir de la base de données et de les PDF? Aussi, l'utilisation Arrays.toString(bytesFromDb)
et Arrays.toString(bytesFromPdf)
de comparer manuellement.OriginalL'auteur Yubaraj | 2014-06-03
Vous devez vous connecter pour publier un commentaire.
Ce
permettra également d'encoder le "0x". En outre, il semble que vous essayez de convertir des valeurs hexadécimales pour un tableau d'octets, alors que cette méthode serait de convertir les valeurs des caractères d'octets.
Je crois que ce que vous cherchez est
Essayer.
java.lang.IllegalArgumentException: hexBinary needs to be even-length:
. Il n'a même pas la longueurEssayer d'ajouter un zéro au début. Pourriez-vous montrer le code que vous utilisez pour extraire les données de la base de données? Êtes-vous sûr que vous ne pouvez pas obtenir que d'un tableau d'octets déjà au lieu d'une chaîne et de le convertir ensuite en arrière?
J'ai mis à jour la question merci de regarder là-bas.
OriginalL'auteur Zoltán
De l'omi, c'est un problème de conversion de Chaîne de caractères ...
L'exemple suivant illustre une façon - peut-être pas le plus intelligent 😀
OriginalL'auteur OkieOth