如何将电子邮件附件直接保存到数据库而不先保存到硬盘?
How to save e-mail Attachment directly to Database without saving to HDD First?
我找到了一个很好的 Java 脚本,它连接到我的电子邮件服务器并从中获取新的电子邮件内容。这个 java 程序,把电子邮件附件也下载到我的硬盘上。但我需要将附件(PDF、EXCEL、WORD、图像等)直接保存到我的数据库,而不是先保存到 HDD,然后再上传到我的数据库(我使用的是 Oracle 12C 数据库)table.
我是Java菜鸟程序员,欢迎对我的问题提出任何提示。
谢谢!
这是将附件保存到硬盘的代码片段:
public void procesMultiPart(Multipart content) {
try {
for (int i = 0; i < content.getCount(); i++) {
BodyPart bodyPart = content.getBodyPart(i);
Object o;
o = bodyPart.getContent();
if (o instanceof String) {
System.out.println("procesMultiPart");
} else if (null != bodyPart.getDisposition() && bodyPart.getDisposition().equalsIgnoreCase(Part.ATTACHMENT)) {
String fileName = bodyPart.getFileName();
System.out.println("fileName = " + fileName);
InputStream inStream = bodyPart.getInputStream();
FileOutputStream outStream = new FileOutputStream(new File(downloadDirectory + fileName));
byte[] tempBuffer = new byte[4096]; // 4 KB
int numRead;
while ((numRead = inStream.read(tempBuffer)) != -1) {
outStream.write(tempBuffer);
}
inStream.close();
outStream.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
警告:我无法真正对此进行测试,但这基本上就是您要查找的内容:
//----------snip
InputStream inStream = bodyPart.getInputStream();
//The outstream can be any output stream, I switch this to one that writes to memory (byte[]).
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] tempBuffer = new byte[4096]; // 4 KB
int numRead;
while ((numRead = inStream.read(tempBuffer)) != -1) {
outStream.write(tempBuffer);
}
//Handle object here
byte[] attachment = outStream.toByteArray();
//Pseudo Code Begins
SQL.createAttachment(attachment); //I'm assuming there's a static method to do this
inStream.close();
outStream.close();
//-----------------snip
代码完全相同,您只需要正确定位数据即可。这意味着要连接到您的数据库,编写一些 SQL(或使用框架)插入其中等等...
这大概超出了单题解答的范围。我将如何处理?可能是这样的(我假设你可以打开一个连接并让一切正常工作。我显然没有模式)。
static Connection oracle; //Psuedo Code
//SQL class
public static createAttachment(byte[] blob)
{
//exception handling skipped
Query q = oracle.createQuery("INSERT INTO Attachments Values(?)");
q.setParameter(0, blob);
q.execute();
}
希望这能为您指明正确的方向。它并不全面,但它是一个解决方案。这也是一个糟糕的设计,但它可能不是您正在使用的问题。我什至没有在这里解决资源管理问题。
我找到了一个很好的 Java 脚本,它连接到我的电子邮件服务器并从中获取新的电子邮件内容。这个 java 程序,把电子邮件附件也下载到我的硬盘上。但我需要将附件(PDF、EXCEL、WORD、图像等)直接保存到我的数据库,而不是先保存到 HDD,然后再上传到我的数据库(我使用的是 Oracle 12C 数据库)table.
我是Java菜鸟程序员,欢迎对我的问题提出任何提示。 谢谢!
这是将附件保存到硬盘的代码片段:
public void procesMultiPart(Multipart content) {
try {
for (int i = 0; i < content.getCount(); i++) {
BodyPart bodyPart = content.getBodyPart(i);
Object o;
o = bodyPart.getContent();
if (o instanceof String) {
System.out.println("procesMultiPart");
} else if (null != bodyPart.getDisposition() && bodyPart.getDisposition().equalsIgnoreCase(Part.ATTACHMENT)) {
String fileName = bodyPart.getFileName();
System.out.println("fileName = " + fileName);
InputStream inStream = bodyPart.getInputStream();
FileOutputStream outStream = new FileOutputStream(new File(downloadDirectory + fileName));
byte[] tempBuffer = new byte[4096]; // 4 KB
int numRead;
while ((numRead = inStream.read(tempBuffer)) != -1) {
outStream.write(tempBuffer);
}
inStream.close();
outStream.close();
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
警告:我无法真正对此进行测试,但这基本上就是您要查找的内容:
//----------snip
InputStream inStream = bodyPart.getInputStream();
//The outstream can be any output stream, I switch this to one that writes to memory (byte[]).
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] tempBuffer = new byte[4096]; // 4 KB
int numRead;
while ((numRead = inStream.read(tempBuffer)) != -1) {
outStream.write(tempBuffer);
}
//Handle object here
byte[] attachment = outStream.toByteArray();
//Pseudo Code Begins
SQL.createAttachment(attachment); //I'm assuming there's a static method to do this
inStream.close();
outStream.close();
//-----------------snip
代码完全相同,您只需要正确定位数据即可。这意味着要连接到您的数据库,编写一些 SQL(或使用框架)插入其中等等...
这大概超出了单题解答的范围。我将如何处理?可能是这样的(我假设你可以打开一个连接并让一切正常工作。我显然没有模式)。
static Connection oracle; //Psuedo Code
//SQL class
public static createAttachment(byte[] blob)
{
//exception handling skipped
Query q = oracle.createQuery("INSERT INTO Attachments Values(?)");
q.setParameter(0, blob);
q.execute();
}
希望这能为您指明正确的方向。它并不全面,但它是一个解决方案。这也是一个糟糕的设计,但它可能不是您正在使用的问题。我什至没有在这里解决资源管理问题。