77.【JavaWeb文件上传和邮件发送04】(二)

简介: 77.【JavaWeb文件上传和邮件发送04】

5.完整代码

package com.Jsxs.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 org.junit.jupiter.api.Test;
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 Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = "文件上传失败!";
//*        判断文件上传的是普通表单还是带文件的表单,
//        if (ServletFileUpload.isMultipartContent(req)) {
//            System.out.println("失败");
//            return;//如果是普通表带那就进入直接返回,否则就不运行
//        }
        try {
//创建上传文件的保存路径,建议保存为在web-inf的路径下,用户无法直接访问上面的图片
            String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录
            File file = new File(uploadPath);
//  假如说文件目录不存在情况下,我们就创建
            if (!file.exists()) {
                file.mkdir(); //创建这个目录
            }
//*  缓存,临时文件。假如文件超过了预期的大小,我们就把他放入到一个临时文件中,活几天自动删除或提示用户转存为永久
            String tempRealPath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 创建一个文件目录
            File tempFile = new File(tempRealPath);
//  假如说文件目录不存在情况下,我们就创建
            if (!tempFile.exists()) {
                tempFile.mkdir(); //创建这个临时目录
            }
//* 处理上传的文件,一般都需要通过流来获取,我们可以使用req.getInputStream(),原生态的上传流获取,十分麻烦
//  但是我们都建议使用Apeache的文件上传组件来实现,common.fileupload,它需要依赖于commons-io组件
// ***************** 1.创建DiskFileItemFactory对象,处理文件上传路径或则大小限制的
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//  2.通过这个工厂设置一个缓冲区,当上传的文件大于这个缓冲区的时候,将她放到临时文件中去
            diskFileItemFactory.setSizeThreshold(1024 * 1024);  //缓存大小为1MB
//  3.
            diskFileItemFactory.setRepository(tempFile);   //临时目录的保存目录,需要一个file
/*
 ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个Filetem对象,
在使用ServletFileUpload对象解析请求时需要DiskFileletemFactory对象。
所以,我们需要在进行解析工作前构造好DiskFileltemFactory对象,
通过servletFileUpload对象的构造方法或setFileltemFactory()方法
设置ServletFileUpload对象的FileitemFactory属性
 */
// ******************* 4.获取servletFileUpload
            ServletFileUpload upload = new ServletFileUpload(diskFileItemFactory);
//  5.监听文件上传的速度
            upload.setProgressListener(new ProgressListener() {
                public void update(long l, long l1, int i) {
                    System.out.println("总大小" + l1 + "已上传:" + l);
                }
            });
//  处理乱码问题
            upload.setHeaderEncoding("UTF-8");
//  设置单个文件的最大值
//   1024=1kb*1024=1MB*10=10MB
            upload.setSizeMax(1024 * 1024 * 10);
// ******************* 6. 处理上传文件
            //(1).把前端请求解析,封装成一个FileItem对象,需要从ServletFileUpload对象中获取
            List<FileItem> fileItems = upload.parseRequest(req);
            for (FileItem fileItem : fileItems) {
//   判断上传的文件是普通的表单还是带文件的表单
                if (fileItem.isFormField()) {  //假如说普通的表单
//   判断上传的文件是普通的表单还是带文件的表单
                    String fieldName = fileItem.getFieldName();
                    String value = fileItem.getString("UTF-8");
                    System.out.println(fieldName + ":" + value);
                } else {  //假如是文件
                    //==================处理文件================//
                    String uploadFileName = fileItem.getName();
                    System.out.println("上传的文件名是:"+uploadFileName);
                    //可能存在文件名不合法的情况
                    if (uploadFileName.trim().equals("") || uploadFileName == null) {
                        continue;
                    }
                    //获得上传的文件名 /imges/girl.jpg
                    String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1);
                    //获得文件的后缀名
                    String fileName_End = uploadFileName.substring(uploadFileName.lastIndexOf(".")+ 1);
                    System.out.println("文件信息【件名:"+fileName+"--->文件类型"+fileName_End+"】");
            /*
                如果文件后缀名fileName_End 不是我们所需要的
                就直接return,不处理,告诉用户文件类型不对
             */
                    //可以使用UUID(唯一识别的通用码),保证文件名唯一
                    //UUID.randomUUID(),随机生成一个唯一识别的通用码;
                    //网络传输中的东西,都需要序列化
                    //POJO,实体类,如果想要在多个电脑上运行,需要传输====》需要把对象都序列化
                    String uuidPath = UUID.randomUUID().toString();
                    //==================存放地址================//
                    //存到哪? :uploadPath--->创建的文件目录
                    // 文件真实存在的路径:realPathFile
                    String realPath = uploadPath + "/" + uuidPath;
                    //给每个文件创建一个对应的文件夹
                    File realPathFile = new File(realPath);
                    if (!realPathFile.exists()) {  //假如说不存在就创建
                        realPathFile.mkdir();
                    }
                    //==================文件传输================//
                    //获得文件上传的流
                    InputStream inputStream = fileItem.getInputStream();
                    //创建一个文件输出流
                    //realpath=真实的文件夹
                    //差一个文件,加上输出文件的名字+"/+uuidPath"
                    FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName);
                    //创建一个缓冲区
                    byte[] bytes = new byte[1024 * 1024];
                    //判断是否读取完毕
                    int len = 0;
                    //如果大于0说明还存在数
                    while ((len = inputStream.read(bytes)) > 0) {
                        fileOutputStream.write(bytes, 0, len);
                    }
                    //关闭流
                    fileOutputStream.close();
                    inputStream.close();
                    msg = "文件上传成功!";
                    fileItem.delete(); //上传成功,清楚临时文件
                }
            }
            req.setAttribute("msg",msg);
            req.getRequestDispatcher("info.jsp").forward(req,resp);
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>上传资源入口</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        .pic{
            /*background : url("..img/back8.jng");*/
            height:100%;
            width: 100%;
            background-size: cover;
            background-repeat: no-repeat;
            margin: 60px auto;
        }
        .contain{
            box-shadow: 10px 10px 60px rgba(93, 86, 20, 0.909);
            margin: 0 auto;
            width: 500px;
            height: 500px;
            border-radius: 20px;
            padding-top: 60px;
        }
        input.seat{
            margin-top: 40px;
            height: 35px;
            width: 350px;
        }
        .input_out{
            height: 54px;
            width:100px;
            margin-top: 41px;
            background-color: #6495ED;
            border-width: 0px;
            font-size: 20px;
            color: white;
            margin-left: -5px;
            border-top-right-radius: 10px;  /*圆角*/
            border-bottom-right-radius: 10px;  /*圆角*/
            border-top-left-radius:10px;
            border-bottom-left-radius:10px;
        }
        .bjimg{
            position: fixed;
            top:0;
            left:0;
            width: 100%;
            height: 100%;
            z-index: -10;
            /*适应*/
            object-fit: cover;
        }
        #file{
            width: 200px;
            height: 100px;
        }
    </style>
</head>
<body>
<video src="img/1.mp4" loop autoplay class="bjimg"></video>
<div class="pic">
    <div class="contain"  >
        <form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data">
            <div align="center">
            <br/>
            <strong><span style="font-size: 40px; color: white; font-family: 楷体">文件传输页面</span></strong><br></div>
            <div align="center">
            <br/><br/>
            <input type="text" class="seat" name="username" placeholder="请输入上传用户名" id="seat"><br>
             <input type="file" placeholder="上传文件" name="FileUpload" style="background: aqua" id="file"><br/>
            <br/>
            <input type="submit" class="input_out" onmousemove="this.className='input_move'" onmouseout="this.className='input_out'" value="开始上传">
        </div>
        </form>
    </div>
</div>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="4.0" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<!--对servlet进行配置-->
<servlet>
    <servlet-name>Servlet</servlet-name>
    <servlet-class>com.Jsxs.Servlet.Servlet</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <url-pattern>/upload.do</url-pattern>
    </servlet-mapping>
</web-app>

(二十六)、邮箱发送

1.邮箱发送的原理:


相关文章
|
1月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
307 37
|
10天前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
21 2
|
17天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
20 5
|
18天前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
114 1
|
1月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
27天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
62 2
|
15天前
|
Java
java 文件上传和下载
java 文件上传和下载
15 0
|
1月前
|
SQL JSON JavaScript
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
|
3月前
|
Java
java 文件上传 :MultipartFile 类型转换为file类型
java 文件上传 :MultipartFile 类型转换为file类型
112 9
|
3月前
|
缓存 前端开发 Java
在Java项目中实现高性能的文件上传下载
在Java项目中实现高性能的文件上传下载