2013-03-09 14 views
5

Mogę wysyłać załączniki, które mają nazwy plików spoza ASCII w JavaMail, ale nie mogę ich pobrać. Dostaję java.io.FileNotFoundException specjalnie dla tych załączników, których nazwy plików zawierają znaki spoza ASCII.Znaki JavaMail i inne niż ASCII w nazwach plików

FYI: Używam coś podobnego messageBodyPart.setFileName(MimeUtility.encodeText(filename[i])) zakodować tekst i MimeUtility.decodeText(bodyPart.getFileName()) do dekodowania spoza ASCII nazwy plików

Czy istnieje obejście tego?

EDYTOWANIE @Bill, tutaj jest częścią mojego kodu, który czyta załączniki. W moim kodzie dodałem również właściwości .setProperty ("mail.mime.decodeparameters", "true") i properties. PropertiesProperty ("mail.mime.decodefilename", "true") właściwości.

if (message[a].getContent() instanceof MimeMultipart) { 
       Multipart multipart = (Multipart) message[a].getContent(); 
       for (int i = 0; i < multipart.getCount(); i++) { 
        bodyPart = multipart.getBodyPart(i);      
        disposition = bodyPart.getDisposition();      
        if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT) || (disposition.equals(BodyPart.INLINE)))) { 
         DataHandler handler = bodyPart.getDataHandler(); 
         String path = bodyPart.getFileName(); 
         String[] str = path.split("/");       
         String fileName = str[str.length - 1];      

         String filePath = ReadConfigPropertiesFile.getPropertyValue("server.buildpath"); 
         System.out.println(fileName); 
         File tempDir = new File(filePath + user); 
         if (!tempDir.exists()) { 
          tempDir.mkdir(); 
         } 
         File saveFile = new File(tempDir + "/" + fileName); 
         int count = 0; 
         while (saveFile.exists()) { 
          count++; 
          saveFile = new File(tempDir + "/" + count + "_" + fileName); 
         } 

         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile)); 
         byte[] buff = new byte[2048]; 
         InputStream is = bodyPart.getInputStream(); 
         int ret = 0; 
         while ((ret = is.read(buff)) > 0) { 
          bos.write(buff, 0, ret); 
         } 
         bos.close(); 
         is.close(); 
         //System.out.println(bodyPart.getContentType()); 


        }else { 
         //display body (message) of the attachment; 
         //System.out.println(bodyPart.getContent().toString()); 

        } 
      } 
    } 

Powyższy kod podnosi wyjątek FileNotFoundException na BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile)) linii i to jest coraz podniesiony załączników, których nazwy są znaki spoza ASCII (coś jak ሰላም. Pdf). Wszystko inne działa dobrze.

Odpowiedz

0

Nie powinieneś nigdy sam wykonywać kodowania ani dekodowania.

Istnieją dwa zestawy właściwości można ustawić powiedzieć JavaMail zrobić kodowanie/dekodowanie dla Ciebie:

  • mail.mime.encodefilename/mail.mime.decodefilename
  • mail.mime.encodeparameters /mail.mime.decodeparameters

Zobacz szczegóły na temat pakietu javadocs dla pakietu javax.mail.internet.

Pierwszy zestaw wykorzystuje niestandardową technikę kodowania, podobną do wykonywanej samodzielnie. Działa to dobrze w przypadku niektórych starszych programów pocztowych, które używają tej techniki.

Drugi zestaw korzysta ze standardowej techniki kodowania MIME. Ta wersja działa z większością nowoczesnych programów pocztowych.

Nic z tego nie wyjaśnia, dlaczego uzyskujesz wyjątek FileNotFoundException, ale nie podałeś wystarczająco dużo szczegółów, aby wiedzieć, co robisz, gdy otrzymasz wyjątek.

+0

nadal borykam się z problemem. Jakieś aktualizacje? – semytech

+0

W tym momencie nie jest to problem JavaMail, więc nie mogę zapewnić dużej pomocy. Prawdopodobnie zależy to od tego, jak system operacyjny radzi sobie z nazwami plików ze znakami spoza ASCII. Można napisać trywialny, autonomiczny program Java, aby odtworzyć problem. Podczas tworzenia pliku może być konieczne zakodowanie nazwy pliku, jeśli system operacyjny nie obsługuje go w niezmienionym stanie. –

+0

Ok, dziękuję. Sprawdzę to, tworząc prosty program w języku Java i powiadomię Cię. – semytech

3

Ta odpowiedź pochodzi z komentarza @semytech (OP). Trudno było go tam znaleźć, więc dodam go jako odpowiedź dla większej widoczności. Pomogło mi to z hebrajskimi nazwami plików.

MimeBodyPart attachment = new MimeBodyPart(); 
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null)); 
Powiązane problemy