将JavaMail附件转换为blob吗? [重复]

问题描述 投票:-3回答:1

[如何使用JavaMail将附加到电子邮件的文件转换为可持久的java.sql.blob?在下面的代码尝试中,Eclipse调试器和SYSO命令确定确实存在一个确实会转换为xmlInputStream附件,但是尽管blobcontent变量仍然为空。代码尝试将InputStream传送到其中。

如何更改才能将InputStream正确转换为blob格式?

        for(int y=1;y<=msg_count;y++){
            Message msg = inbox.getMessage(y);
            System.out.println("msg# is: "+y);
            Address[] in = msg.getFrom();
            for (Address address : in) {System.out.println("FROM:" + address.toString());}
            System.out.println("SENT DATE:" + msg.getSentDate());System.out.println("SUBJECT:" + msg.getSubject());
            if(msg.getContent() instanceof String){System.out.println("msg.getContent()(String!) is: "+msg.getContent());}
            if(msg.getContent() instanceof Multipart){
                Multipart mp = (Multipart) msg.getContent();
                for(int a=0;a<mp.getCount();a++){
                    BodyPart bp = mp.getBodyPart(a);
                    System.out.println("a, FILENAME (Multipart!) are: " +a+", "+ bp.getFileName());
                    System.out.println("a, CONTENTTYPE (Multipart!) are: "+a+", "+bp.getContentType());
                    if(bp.getFileName()!=null){
                        if(bp.getFileName().endsWith(".xml")){
                            System.out.println("a, CONTENT, class.name (Multipart!) are: " +a+", "+ bp.getContent()+", "+bp.getClass().getName());
                            if(bp.getContent() instanceof InputStream){
                                InputStream myis = (InputStream)bp.getContent();
                                DocumentPreImport docpre = new DocumentPreImport();
                                SomeDocument cd = mf.unmarshal(new StreamSource(myis), schemaFile);
                                docpre.setDocTitle(cd.getTitle());
                                List<IItempId> ids = cd.getTemplateId();
                                for(int u=0;u<ids.size();u++){docpre.setDocTemplateId(ids.get(0).getRoot());}
                                PatientRole pr = cd.getRecordTarget().get(0).getPatientRole();
                                docpre.setPatientRoleRoot(pr.getId().get(0).getRoot());
                                docpre.setPatientRoleExtension(pr.getId().get(0).getExtension());
                                Blob blob = null;
                                byte[] content = IOUtils.toByteArray(myis);
                                try {
                                    blob = new SerialBlob(content);
                                    docpre.setContent(blob);
                                } 
                                catch (SerialException e) {e.printStackTrace();}
                                catch (SQLException e) {e.printStackTrace();}
                                docpre.setSourceEmailAddress(msg.getFrom()[0].toString());
                                docpre.setMsgSentDate(msg.getSentDate().toString());
                                docpre.setMsgSubject(msg.getSubject());
                                docpre.setImported(false);
                                this.clinicService.saveDocPreImport(docpre);
                            }
                        }
                    }
                }
            }
          msg.setFlag(Flags.Flag.DELETED, true);//flags this message as deleted, which does not yet fully expunge it from server
        }
        inbox.close(true);//expunges from server all the messages which were flagged as deleted. this line is required to actually delete.

更新

我不认为这个问题是重复的。另一个问题特定于InputStream,而该问题普遍适用于JavaMail附件。

java javamail
1个回答
0
投票

您的问题不在转换时,至少我已经测试了以下代码,并且对我来说很好用:

BodyPart bp = mp.getBodyPart(i);
InputStream stream = (InputStream)bp.getInputStream();
byte[] content = IOUtils.toByteArray(stream); //content.length shows correct length
Blob blob = null;
blob = new SerialBlob(content); // blob.length() shows correct length

看看:Why does JavaMail BodyPart.getInputStream() return an empty stream when using IMAP, but not when using POP3?

如果您确实在使用IMAP,请尝试添加以下属性:props.setProperty("mail.imap.partialfetch", "false");

© www.soinside.com 2019 - 2024. All rights reserved.