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);
}
}
运行结果:




浙公网安备 33010602011771号