2013-03-09 32 views
5

Tôi có thể gửi tệp đính kèm có tên tệp không phải ascii trong JavaMail nhưng tôi không thể tải chúng xuống. Tôi nhận được java.io.FileNotFoundException đặc biệt cho những tập tin đính kèm có tên tập tin chứa các ký tự không phải ascii.Ký tự JavaMail và không phải ASCII trong tên tệp

FYI: Tôi đang sử dụng một cái gì đó giống như messageBodyPart.setFileName(MimeUtility.encodeText(filename[i])) để mã hóa văn bản và MimeUtility.decodeText(bodyPart.getFileName()) để giải mã các tên tập tin không ascii

Có một cách giải quyết cho việc này?

EDIT @Vill, đây là một phần mã của tôi đọc tệp đính kèm. Tôi cũng đã thêm thuộc tính properties.setProperty ("mail.mime.decodeparameters", "true") và properties.setProperty ("mail.mime.decodefilename", "true") vào mã của tôi.

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

        } 
      } 
    } 

Đoạn mã trên làm tăng ngoại lệ FileNotFoundException tại BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile)) dòng và điều này là nhận được huy động cho các file đính kèm có tên tập tin là ký tự khác ASCII (cái gì đó như ሰላም. Pdf). Mọi thứ khác hoạt động tốt.

Trả lời

0

Bạn không bao giờ cần phải tự mã hóa hoặc giải mã.

Có hai bộ tài sản mà bạn có thể thiết lập để nói với JavaMail để làm mã hóa/giải mã cho bạn:

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

Xem javadocs cho gói javax.mail.internet để biết chi tiết.

Tập đầu tiên sử dụng kỹ thuật mã hóa không chuẩn, tương tự như kỹ thuật bạn đang làm. Điều này làm việc tốt với một số người gửi thư cũ sử dụng kỹ thuật này.

Tập thứ hai sử dụng kỹ thuật mã hóa chuẩn MIME. Phiên bản này hoạt động với hầu hết các bưu phẩm hiện đại.

Không có điều này giải thích tại sao bạn nhận được FileNotFoundException, nhưng sau đó bạn không cung cấp đủ chi tiết để biết bạn đang làm gì khi bạn nhận được ngoại lệ.

+0

vẫn đang cố gắng giải quyết vấn đề của mình. Bất cứ cập nhập nào? – semytech

+0

Tại thời điểm này, nó không phải là một vấn đề JavaMail vì vậy tôi không thể cung cấp nhiều trợ giúp. Có thể là cách hệ điều hành của bạn giao dịch với tên tệp có ký tự không phải ASCII. Bạn có thể viết một chương trình Java độc lập tầm thường để tái tạo vấn đề. Bạn có thể cần phải mã hóa tên tệp khi tạo tệp nếu hệ điều hành của bạn không xử lý được. –

+0

Ok cảm ơn bạn. Tôi sẽ kiểm tra nó bằng cách tạo chương trình Java đơn giản cho điều đó và sẽ cho bạn biết. – semytech

3

Câu trả lời này lấy từ nhận xét của @semytech (OP). Thật khó để tìm thấy nó ở đó, vì vậy tôi sẽ thêm nó như là câu trả lời cho khả năng hiển thị nhiều hơn. Nó đã giúp tôi với tên tập tin tiếng Hy Lạp.

MimeBodyPart attachment = new MimeBodyPart(); 
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null)); 
Các vấn đề liên quan