如何将电子邮件附件直接保存到数据库而不先保存到硬盘?

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

希望这能为您指明正确的方向。它并不全面,但它是一个解决方案。这也是一个糟糕的设计,但它可能不是您正在使用的问题。我什至没有在这里解决资源管理问题。