JavaWeb-文件上传和邮件发送

前言

该部分内容比较单一,主要是渗透一些文件上传和邮件发送的一些思路,这部分代码是可以复用的,在以后的开发中可以用到,修改几个参数即可。

文件上传

文件上传注意事项

  • 为保证服务器安全,上传的位置一般是用户访问不到的位置(比如WEB-INF)
  • 需要对文件大小做限制
  • 为防止同名文件覆盖,需要为文件提供一个唯一的标识符(时间戳、UUID、MD5...)
  • 可以限制文件上传的类型,在收到上传文件名时,判定该文件后缀名是否合格

Jar包

  • common-fileupload
  • commons-io
<!--Maven依赖-->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.9.0</version>
</dependency>

代码实现

两个JSP页面一个Servlet,一个用于上传文件,另一个是返回提示信息,Servlet负责获取前端信息,请求转发。

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
    <!--设置属性enctype为"multipart/form-data"-->
    <!--method必须为post-->
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
    <p><input type="text" name="username"></p>
    <p><input type="file" name="file1"></p>
    <p><input type="file" name="file2"></p>
    <p><input type="submit"></p>
</form>
</body>
</html>

  • UploadServlet
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        if(!ServletFileUpload.isMultipartContent(req)){ //判断文件是带文件表单还是普通表单
            return;    //终止运行,说明这一定是一个不带文件的
        }
        //为保证服务器安全,上传文件应该放在外界无法直接访问你得目录下,比如放在WEB-INF目录下
        String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
        File uploadFile = new File(uploadPath);
        if(!uploadFile.exists()){
            uploadFile.mkdir();
        }

        // 缓存
        String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
        File file = new File(tempPath);
        if(!file.exists()){
            file.mkdir();
        }
        String msg = null;
        try {
            //1.创建 DiskFileItemFactory
            DiskFileItemFactory factory = getDiskFileItemFactory(file);
            //2.获取ServletFileUpload
            ServletFileUpload upload = getServletFileUpload(factory);
            // 3.处理上传文件
            msg = uploadParseRequest(upload,req,uploadPath);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        // 请求转发消息
        req.setAttribute("msg",msg);
        req.getRequestDispatcher("info.jsp").forward(req,resp);
    }

    public static DiskFileItemFactory getDiskFileItemFactory(File file){
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(1024*1024);    // 缓存区大小为1M
        factory.setRepository(file);            // 临时目录的保存目录,需要一个file
        return  factory;
    }
    public static ServletFileUpload getServletFileUpload(DiskFileItemFactory factory){
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setProgressListener(new ProgressListener() {
            @Override
            public void update(long pBytesRead, long pContenLength, int pItems) {
                System.out.println("总大小:" + pContenLength + "已上传:" + pBytesRead );
            }
        });
        upload.setHeaderEncoding("UTF-8");
        upload.setFileSizeMax(1024*1024*10);
        upload.setSizeMax(1024*1024*10);
        return upload;
    }

    public static String  uploadParseRequest(ServletFileUpload upload,HttpServletRequest req,String uploadPath) throws FileUploadException, IOException {
        String message = null;
        List<FileItem> fileItems = upload.parseRequest(req); // 把前端请求解析,封装成一个FileItem对象
        for (FileItem fileItem : fileItems) {
            if (fileItem.isFormField()) {     // 普通表单
                String name = fileItem.getName();
                String value = fileItem.getString("utf-8");
                System.out.println(name + ":" + value);
            } else {  //判断是文件表单
                String uploadFileName = fileItem.getName(); // ===== 处理文件 =============
                if (uploadFileName.trim().equals("") || uploadFileName == null) {
                    continue;
                }
                //获取文件名和拓展名
                String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1);
                // UUID.randomUUID() 随机生成一个唯一识别的通用码
                // 网络中传输东西,都需要序列化
                // POJO, 实体类, 如果想要生成在多个电脑上运行, 传输-->需要把对象都序列化
                // JNI java native Interface
                // implements Serializable :标记接口 ,JVM --> Java栈 本地方法栈 native --> c++
                String uuidPath = UUID.randomUUID().toString();// 可以 使用UUID(唯一识别的通用码),保证文件唯一
                String realPath = uploadPath + "/" + uuidPath; // ========= 存放地址 ========
                File realPathFile = new File(realPath);
                if (!realPathFile.exists()) {
                    realPathFile.mkdir();
                }
                InputStream is = fileItem.getInputStream(); // ========= 文件传输 ========
                FileOutputStream fos = new FileOutputStream(realPath + "/" + fileName);
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len);
                }
                fos.close();
                is.close();
                message = "文件上传成功";
                fileItem.delete();  //上传成功,清除临时文件
            }
        }
        return message;
        }
}
  • info.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${msg}
</body>
</html>

邮件发送

Jar包

  • javax.mail
  • javax.activation
<!--Maven依赖-->
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.activation/activation -->
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

功能实现

  • index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
    <div class="txt txt0">
        <span style="letter-spacing:8px;">用户名:</span>
        <input name="username" type="text" class="txtphone" placeholder="请输入用户名"/>
    </div>
    <div class="txt txt0">
        <span style="letter-spacing:4px;">登录密码:</span>
        <input name="password" type="text" class="txtphone" placeholder="请输入密码"/>
    </div>
    <div class="txt txt0">
        <span style="letter-spacing:4px;">邮箱:</span>
        <input name="email" type="text" class="txtphone" placeholder="请输入邮箱"/>
    </div>
    <div class="txt txt0">
        <input type="submit" value="注册"/>
    </div>
</form>
</body>
</html>
  • info.jsp:注册成功后跳转的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${message}
</body>
</html>
  • 用户实体类
package pojo;

import java.io.Serializable;

public class User implements Serializable {
    private String username;
    private String password;
    private String email;

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public User() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

  • SendEmail.java
package utils;

import com.sun.mail.util.MailSSLSocketFactory;
import pojo.User;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class SendEmail extends Thread {
    private String from = "发送方@qq.com";
    private String username = "发送方@qq.com";
    private String password = "邮箱授权码";
    private String host = "smtp.qq.com";
    private User user;

    public SendEmail(User user) {
        this.user = user;
    }

    @Override
    public void run() {
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.host", "smtp.qq.com");
            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.socketFactory", sf);

            // 使用JavaMail发送邮件的5个步骤
            // 1、创建session
            Session session = Session.getInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
            // 2. 开启Session的debug模式:true
            session.setDebug(false);
            // 3.通过session得到transport对象
            Transport ts = session.getTransport();
            ts.connect(host, username, password);
            // 4. 创建邮件
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
            message.setSubject("注册邮件");
            String info = "Yours username:" + user.getUsername() + "password:" + user.getPassword();
            message.setContent(info, "text/html;chartset=UTF-8");
            // 5.发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            // 6.关闭连接
            ts.close();
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
}
  • RegisterServlet.java
package servlet;


import pojo.User;
import utils.SendEmail;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        System.out.println(username);
        System.out.println(password);
        System.out.println(email);
        if(!"".equals(username) && !"".equals(password) && !"".equals(email)) {
            User user = new User(username,password,email);
            SendEmail sendEmail = new SendEmail(user);
            sendEmail.start();
            req.setAttribute("message","注册成功!请查看邮件");
            req.getRequestDispatcher("info.jsp").forward(req,resp);

        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

运行结果:

posted @ 2021-05-28 19:33  Code_Ice  阅读(112)  评论(0)    收藏  举报