首页 > 编程语言 >Java Mail发送邮件附件名称乱码问题,MultiPartFile与File互相转换

Java Mail发送邮件附件名称乱码问题,MultiPartFile与File互相转换

时间:2022-09-26 16:12:36浏览次数:48  
标签:邮件附件 Java File attachPart 乱码 file 附件

Java Mail 发送邮件(带附件)

SpringBoot框架集成的有Java MailSender,相比Java Mail,MailSender使用起来其实更加的方便

1、MultiPartFile与File互相转换

网上能查到很多种方式,我这里只记录两种。

1、利用工具类创建临时文件
//伪代码,只是展示处理逻辑
//邮件内容
MimeMultipart mm = new MimeMultipart();
//前段传来的MultipartFile类型的附件
MultipartFile file = mailRecord.getFile();
String originalFilename = file.getOriginalFilename();
//利用File.createTempFile(prefix,sufix)创建临时文件
//这里要注意,prefix不能小于三个字符,否则会抛出异常
//利用FilenameUtils提供的方法分别获取原文件的前缀和后缀,附件名称可另外设置,这里不用在意名称显示得对不对,错了也无所谓
File tempFile = File.createTempFile(FilenameUtils.getBaseName(originalFilename), FilenameUtils.getExtension(originalFilename));
MimeBodyPart attachPart = new MimeBodyPart();
//临时文件作为附件,添加到邮件内容中
attachPart.attachFile(tempFile);
//这里是另外设置附件的名称,所以上面才会说临时文件的名字不会影响最终效果
attachPart.setFileName(MimeUtility.encodeText(file.getOriginalFilename()));
mm.addBodyPart(attachPart);
//别忘了删除临时文件
tempFile.deleteOnExit();
2、手写IO流转换代码
//真实代码,可直接复制使用
public static File multipartFileToFile(MultipartFile multipartFile) {
        File file = null;
        //判断是否为null
        if (multipartFile.getSize() <= 0) {
            return null;
        }
        //MultipartFile转换为File
        InputStream ins = null;
        OutputStream os = null;
        try {
            ins = multipartFile.getInputStream();
            String fileName = multipartFile.getOriginalFilename();
            file = new File(fileName);
            os = new FileOutputStream(file);
            int bytesRead;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ins != null){
                try {
                    ins.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return file;
    }

//邮件内容
MimeMultipart mm = new MimeMultipart();
//前段传来的MultipartFile类型的附件
MultipartFile file = mailRecord.getFile();
//类型转换
File file1 = multipartFileToFile(file);
MimeBodyPart attachPart = new MimeBodyPart();
attachPart.attachFile(file1);
//另外设置附件名称,我这里直接拿的原文件名称
attachPart.setFileName(MimeUtility.encodeText(file.getOriginalFilename()));
mm.addBodyPart(attachPart);
//一定不要忘了删除文件
 if (file1 != null){
     file1.deleteOnExit();
}

2、附件名称乱码问题

没有设置的话,附件里有中文的话很容易出现乱码问题
我们可以使用MimeUtility.encodeText()方法进行设置

//上面的两种方式都进行了编码设置,这样就不会出现乱码了
attachPart.setFileName(MimeUtility.encodeText(file.getOriginalFilename()));

标签:邮件附件,Java,File,attachPart,乱码,file,附件
From: https://www.cnblogs.com/bbttz/p/16700655.html

相关文章