文件上传和邮件发送.md 6.4 KB

[TOC]

文件上传


1、上传注意事项

  1. 上传的文件存放在一个不能使用外界URL访问的目录下面,比如WEB-INF目录下
  2. 上传到同一个文件夹中的文件名称应该唯一:使用时间戳/UUID/MD5等手段实现
  3. 限制上传文件的最大值:因为服务器上硬盘资源很贵,不能让用户随意的使用
  4. 限制文件上传类型:比如这个文件夹只用来存储图片,那你就不能上传一个.mp4的文件

2、文件上传需要使用到的3个类+1个属性

  • ServletFileUpload:在后端获取文件上传的文件数据,并将上传文件数据的表单中的每个输入项都封装为一个FileItem对象
  • FileItem
  • DiskFileItemFactory:使用ServletFileUpload解析前端表单传过来的文件数据时需要使用到DiskFileItemFactory对象,所以在获取ServletFileUpload对象之前我们需要先获取DiskFileItemFactory对象
  • fileItemFactory属性:ServletFileUpload对象的一个属性
  • ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象, 在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。所以,我们需要在进行解析工作前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory()方法设置ServletFileUpload对象的fileItemFactory属性。

3、常用方法介绍

//isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单
//还是一个文件表单,如果是普通表单字段则返回true,否则返回false
boolean isFormField();

//getFieldName方法用于返回表单标签name属性的值。
String getFieldName();//获取这个input的name属性值

//getString方法用于将FileItem对象中保存的数据流内容以一个字符串返回
String getString();//用字符串存储文件的数据流
    
//getName方法用于获得文件上传字段中的文件名
String getName();

//以流的形式返回上传文件的数据内容。
InputStream getInputStream()

//delete方法用来清空FileItem类对象中存放的主体内容
//如果主体内容被保存在临时文件中,delete方法将删除该临时文件。
void delete();

4、ServletFileUpload 类

ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中 . 使用其parseRequest(HttpServletRequest) 方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回,使用该方法处理上传文件简单易用

邮件发送


1、 发送原理

image-20211129185904209

  1. 张三通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器
  2. 网易分析发现需要去QQ的邮件服务器,通过Smtp协议将邮件转投给QQ的Smtp服务器
  3. QQ将接收到的邮件存储在456789@qq.com这个邮件账号的空间中
  4. 李四通过Pop3协议连接到Pop3服务器收取邮件
  5. 从456789@qq.com这个邮件账号的空间中取出邮件
  6. Pop3服务器将取出来的邮件送道李四手中

2、 复杂文件内容的发送

image-20211130100009703

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class MailDemo02 {
    public static void main(String[] args) throws Exception {
        Properties prop=new Properties();
        prop.setProperty("mail.host","smtp.qq.com");// 设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol","smtp");// 邮件发送协议
        prop.setProperty("mail.smtp.auth","true");// 需要验证用户密码
        // QQ邮箱需要设置SSL加密
        MailSSLSocketFactory sf=new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable","true");
        prop.put("mail.smtp.ssl.socketFactory",sf);

        // 使用javaMail发送邮件的5个步骤
        // 1.创建定义整个应用程序所需要的环境信息的session对象
        Session session=Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("11927XXX@qq.com","授权码");
            }
        });
        // 开启session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);
        // 2.通过session得到transport对象
        Transport ts=session.getTransport();
        // 3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","11927XXX@qq.com","授权码");
        // 4.创建邮件:写文件
        // 注意需要传递session
        MimeMessage message=new MimeMessage(session);
        // 指明邮件的发件人
        message.setFrom(new InternetAddress("11927XXX@qq.com"));
        // 指明邮件的收件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("11927XXX@qq.com"));
        // 邮件标题
        message.setSubject("java发出");

        // 邮件的文本内容
        // =================================准备图片数据=======================================
        MimeBodyPart image=new MimeBodyPart();
        // 图片需要经过数据化的处理
        DataHandler dh=new DataHandler(new FileDataSource("src/resources/1.jpg"));
        // 在part中放入这个处理过图片的数据
        image.setDataHandler(dh);
        // 给这个part设置一个ID名字,sr
        image.setContentID("1.jpg");

        // 准备正文的数据
        MimeBodyPart text=new MimeBodyPart();
        text.setContent("这是一张正文<img src='cid:1.jpg'>","text/html;charset=UTF-8");

        // 描述数据关系
        MimeMultipart mm=new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        // 设置到消息中,保存修改
        message.setContent(mm);
        message.saveChanges();
        // 5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());

        // 6.关闭连接
        ts.close();

    }
}