遇见狂神说 --- [ 文件上传,邮件发送实现 ]
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了遇见狂神说 --- [ 文件上传,邮件发送实现 ]相关的知识,希望对你有一定的参考价值。
传送门==>B站遇见狂神说
笔记和练习只是跟着视频整理的;但是有的知识点并没有整理进来
文件上传
先创建一个空文件夹的项目;
在file处新建module
将web.xml
修改一下;
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
浏览器文件上传其实就是以流的方式提交到服务端.
在pom.xml
文件导入依赖,下载jar包
<dependencies>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
注意
上传文件需要放在外界无法直接访问的目录,例如
web-inf
目录; 且上传文件的文件名一定要保持唯一性; 网站会限制文件上传的最大值和类型(后缀名);
ServletFileUpload==>处理上传文件数据,将表单的每一项输入封装为Fileltem对象;
解析请求时需要 DiskFileltemFacyory对象
注意 get提交方式;文件大小有限制
提交文件的页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--注意 get提交方式;文件大小有限制--%>
<form action="${pageContext.request.contextPath}/upload.do" enctype="multipart/form-data" method="post">
上传者:<input type="text" name="user">
<div><input type="file" name="myFile0"></div>
<input type="submit" value="上传提交">
<input type="reset" value="重置页面">
</form>
</body>
</html>
上传后的提示页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
提示信息===>${message}
</body>
</html>
处理上传的文件
package com.xiaozhi.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;
public class FileServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//首先判断表单是否为 ==>上传文件的表单;
if (!ServletFileUpload.isMultipartContent(req)) {
//普通表单=>终止方法;
return;
}
String message=null;
try {
//带文件的表单;
//创建上传文件的最终保存地址;
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 tempFile = new File(tempPath);
if (!tempFile.exists()) {
//创建临时目录;
tempFile.mkdir();
}
//先创建DiskFileItemFactory对象;=======================================>>>
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//设置缓冲区大小为 1M;
diskFileItemFactory.setSizeThreshold(1024 * 1024);
//临时文件保存目录;
diskFileItemFactory.setRepository(tempFile);
//获取ServletFileUpload对象============================================>>>
//作用是处理上传文件数据,将表单的每一项输入封装为Fileltem对象;
ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
//监听文件上传进度;
servletFileUpload.setProgressListener(new ProgressListener() {
//l:已读取的文件大小; l1:文件大小
public void update(long l, long l1, int i) {
System.out.println("文件总大小==>" + l1 + " -已经上传==>" + l);
}
});
//处理文件乱码;
servletFileUpload.setHeaderEncoding("utf-8");
//设置单个文件最大值; 3M
servletFileUpload.setFileSizeMax(3 * 1024 * 1024);
//设置总大小; 100M
servletFileUpload.setSizeMax(100 * 1024 * 1024);
//处理上传的文件;============================================>>>
//前端请求解析; 封装为fileItem对象
List<FileItem> fileItems = servletFileUpload.parseRequest(req);
for (FileItem fileItem : fileItems) {
//判断是输入框还是上传文件的;
//注意这个方法: 当返回 false 时才是文件类型的;
if (fileItem.isFormField()) {
//获取其他标签框的name;
String name = fileItem.getName();
//处理乱码问题;(统一编码)
String value = fileItem.getString("utf-8");
System.out.println(name + "<--->" + value);
} else {
//获取文件名;
String uploadName = fileItem.getName();
System.out.println("注意上传的文件名==>" + uploadName);
//对空文件名进行限制拦截;
if ( uploadName == null||uploadName.trim().equals("")) {
continue;
}
//输入文件的名字;与后缀名;
String realName = uploadName.substring(uploadName.lastIndexOf("/") + 1);
String nameSuffix = uploadName.substring(uploadName.lastIndexOf(".") + 1);
System.out.println("实际文件名==>" + realName + "后缀文件类型=>" + nameSuffix);
//使用UUID生成的随机通用码保证文件唯一性;
String uploadFileID = UUID.randomUUID().toString();
//文件的存放地址问题============================================>>>
//文件真实地址加上uuid的通用码;
String realPath=uploadPath+"/"+uploadFileID;
File realFile = new File(realPath);
if (!realFile.exists()) {
//创建目录;
realFile.mkdir();
}
//文件传输==>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>流的方式;
InputStream inputStream=fileItem.getInputStream();
//输出流;
FileOutputStream out=new FileOutputStream(realPath+"/"+realName);
//创建传输的缓冲区;
byte[] bytes=new byte[1024];
int len=0;
while ((len=inputStream.read(bytes))>0){
out.write(bytes,0,len);
}
//关闭;释放资源;
out.close();
inputStream.close();
message="<==上传成功==>";
//清除临时文件;
fileItem.delete();
}
}
} catch (FileUploadException e) {
message="失败!!!";
e.printStackTrace();
}
//转发消息;
req.setAttribute("message",message);
req.getRequestDispatcher("info.jsp").forward(req,resp);
}
}
web.xml
配置servlet
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>com.xiaozhi.servlet.FileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload.do</url-pattern>
</servlet-mapping>
运行
邮件发送
首先会把邮件存到服务器;根据对应的邮件;再通过服务器发出.
发送邮件==>SMTP协议;
接收邮件==>POP3协议
需要用到的jar包; mail/1.4.7.jar
; activation/1.1.1.jar
到maven仓库下载
https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
https://mvnrepository.com/artifact/javax.activation/activation/1.1.1
使用到的主要是三个作用对象;
session对象
定义整个程序所需要的环境信息, 例如主机名,端口号,采用邮件发送和接收协议.>
创建Transport对象
发送邮件>
引用message对象
,表示一封电子邮件
创建一个普通项目后,将jar包导入;
在jar包存在这个类 ==>MimeMessage
百度
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
简单的邮件; ===>纯文本邮件
复杂邮件 ==> 有附件,图片…
发送邮件,要先获得协议与支持,开启服务,POP3,SMTP
例如在QQ邮箱开启服务,开启后会生成授权码;
实现发送一封纯文本邮件
package com.xiaozhi;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
//尝试发送一封纯文本邮件;
public class TestSendMail01 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties properties=new Properties();
//设置qq邮件服务器;
properties.setProperty("mail.host","smtp.qq.com");
//邮件发送协议;
properties.setProperty("mail.transport.protocol","smtp");
//需要验证用户名与密码;
properties.setProperty("mail.smtp.auth","true");
//QQ邮箱的SSL加密;
MailSSLSocketFactory sf=new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable","true");
properties.put("mail.smtp.ssl.socketFactory",sf);
//使用JavaMail发送邮件;
//1.首先创建整个应用程序的全局session对象;(启动==>session销毁结束)
//QQ的独特创建方式;===>
Session session=Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//userName:用户名 password:授权码
return new PasswordAuthentication("发送人@qq.com","授权码");
}
});
//开启session的debug模式;
session.setDebug(true);
//2.session==>获取Transport对象
Transport ts=session.getTransport();
//3.使用邮箱的授权码,用户名,连接邮件的服务器;
ts.connect("smtp.qq.com","发送人@qq.com","授权码");
//4.创建邮件; 需要传递session;
MimeMessage message=new MimeMessage(session);
//需要指明邮件的发送人;
message.setFrom(new InternetAddress("发送人@qq.com"));
//指明收件人==> 此处为自发;
message.setRecipient(Message.RecipientType.TO,new InternetAddress("接收人@qq.com"));
//邮件标题;
message.setSubject("在吗在吗","utf-8");
//文本内容;
message.setContent("<h3 style='color: #FF1493'>好耶,收到消息的话请回复.</h3>","text/html;charset=UTF-8");
//5.发送邮件; 需要指明发送的地址;
ts.sendMessage(message, message.getAllRecipients());
//6.关闭;
ts.close();
}
}
运行,邮件成功发出
《遇见狂神说》Javaweb之Servlet技术