Загрузка Word Document из Gmail с использованием Javamail - PullRequest
0 голосов
/ 15 октября 2011

Я использую Javamail API и пытаюсь загрузить файл вложения, например, файл слова.Проблема в том, что я получаю исключение декодирования base64 при попытке прочитать байты и сохранить его в файл.Для этой цели я использую следующий код:

Исключение стека:

IOException:com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: needed 4 valid base64 characters but only got 2 before EOF, the 10 most recent characters were: "AG4AAAAAAA"

Код JavaMail:

 private void getAttachments(Message temp) throws IOException, MessagingException {
        List<File> attachments = new ArrayList<File>();

        Multipart multipart = (Multipart) temp.getContent();

        System.out.println(multipart.getCount());

        for (int i = 0; i < multipart.getCount(); i++) {
            BodyPart bodyPart = multipart.getBodyPart(i);
            if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {
                continue; // dealing with attachments only
            }
            InputStream is = bodyPart.getInputStream();


            File f = new File("C:\\Attachments\\" + bodyPart.getFileName());

          //  saveFile(bodyPart.getFileName(),is);

            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            while (br.ready()) {
                System.out.println(br.readLine());
            }



           saveFile(bodyPart.getFileName(),is);

            attachments.add(f);
        }



public static void saveFile(String filename,InputStream input) 
    {

        System.out.println(filename);
        try {
            if (filename == null) {
                //filename = File.createTempFile("VSX", ".out").getName();
                return;
            }
            // Do no overwrite existing file
            filename = "C:\\Attachments\\" + filename;
            File file = new File(filename);
            for (int i = 0; file.exists(); i++) {
                file = new File(filename + i);
            }
            FileOutputStream fos = new FileOutputStream(file);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            BufferedInputStream bis = new BufferedInputStream(input);


            int aByte;
            while ((aByte = bis.read()) >=0) {
                bos.write(aByte);
            }

            bos.flush();
            bos.close();
            bis.close();
        } // end of try()
        catch (IOException exp) {
            System.out.println("IOException:" + exp);
        }
    } //end of saveFile()

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Вам нужно отключить частичную выборку, чтобы избавиться от этой проблемы.Вот как вы можете это сделать

props.setProperty("mail.imap.partialfetch", "false");

или

props.setProperty("mail.imaps.partialfetch", "false");

, если вы работаете с imaps.

Вот полная ссылка: JavaMail BaseEncode64Ошибка

0 голосов
/ 15 октября 2011

Используйте метод saveFile () из MimeBodyPart.И если вы действительно хотите разыграть собственную (!) Остановку чтения строк из входного потока, прежде чем передать его в свой метод saveFile.Вы потребляете часть контента, которая может способствовать возникновению проблемы.

...