JavaWeb文件上传

简介: JavaWeb文件上传

JavaWeb文件上传

Hello,各位小伙伴好久不见,本周我们学习JavaWeb中最重要的技术之一,文件上传,该案例我会用一个小型的用户管理系统实现,一步步带入,内容通俗易懂,下面我们步入正题!

做一个简单的用户管理系统

功能如下

用户注册,参数有用户名,用户名密码,用户头像,

用户登录,登录成功后跳转至主页显示用户头像和名称,支持注销账号,注销账号后,页面跳转至登录页

==技术栈:后端采用JavaWebMySQL5.7Druid连接池、前端采用bootstrap框架结合jsp==

先上效果

完整操作项目演示:

包含:用户注册,用户登录,用户登录后显示用户信息,即头像,账号名,最右侧显示注销,点击注销后跳转至登录页

在这里插入图片描述

在这里插入图片描述

项目结构

Java源码

在这里插入图片描述

前端页面jsp

在这里插入图片描述

准备工作

数据表准备

t_user_info

CREATE TABLE `t_user_info` (
  `noid` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
  `head_portrait_path` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL,
  PRIMARY KEY (`noid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Jar文件准备

项目所需jar包如下

在这里插入图片描述

jar文件放在WEB-INF/lib文件夹下,主要是为了安全。

文件上传需要的jar包:

在这里插入图片描述

jar文件我会同步资源,小伙伴们不用担心哦~

项目结构简介

本项目采用三层架构实现,即:service层、dao层、servlet层

  1. servlet层:

    由于之前的servlet层类增删改查的类太过于多,导致代码冗余,所以在jsp页面发送请求时,采用模块化的方式进行访问,例如:

    http://localhost/Blog/user/addUser 访问user模块的addUser

    http://localhost/Blog/user/getUserList 访问user模块的getUserList

    http://localhost/Blog/dept/addDept 访问dept的addDept

    http://localhost/Blog/dept/getDeptList 访问dept的getDeptList

    这样一个对应的类解决该类的所有对数据库的增删改查操作,提高了程序的可维护性,减少代码的冗余,提高了程序的健壮性。

    抽取出公共父类:BaseServlet

BaseServlet类核心代码

public class BaseServlet extends HttpServlet{

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取浏览器请求的资源
        String uri = req.getRequestURI();
        //2.获取请求的方法名,最后斜线后面的内容
        String methodName = uri.substring(uri.lastIndexOf("/")+1);
        try {
            //3.根据方法名获取方法,通过反射获取
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //4.调用方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  1. dao层

    dao层抽取出公共数据库连接类,BaseDao,基于db.properties配置文件连接本地数据库

db.properties配置文件:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1/db_blog?useSSL=true
username=root
password=111111

BaseDao核心代码

public class BaseDao {

    //采用单例模式实现,防止数据库连接超时
    private static DataSource ds = null;
    
    public QueryRunner initQueryRunner() throws Exception {
        if (ds == null) {
            String dbFile = this.getClass().getClassLoader().getResource("/").getFile();
            dbFile = dbFile.substring(1) + "db.properties";
            
            FileReader fr = new FileReader(dbFile);
            
            Properties pro = new Properties();
            pro.load(fr);
            
            ds = DruidDataSourceFactory.createDataSource(pro);
        }
        QueryRunner qur = new QueryRunner(ds);
        return qur;
    }
}

Userservlet核心代码

@WebServlet("/user/*")
public class UserServlet extends BaseServlet{

    //业务层类,用于调用业务层方法
    UserService userService = new UserServiceImpl();
    
    /**
     * 注册用户
     * @param req
     * @param resp
     */
    public void register(HttpServletRequest req, HttpServletResponse resp) {
        //获取数据
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload fileUpload  = new ServletFileUpload(factory);
        try {
            List<FileItem> fileItemList = fileUpload.parseRequest(req);
            //获取当前项目的路径
            String classesPath = this.getClass().getResource("/").getPath();
            
            File f1 = new File(classesPath);
            //项目路径
            String projectPath = f1.getParentFile().getParentFile().getParentFile().getAbsolutePath();
            
            //最后上传的路径
            String uploadPath = projectPath + "\\ROOT\\upload\\";
            
            File f2 = new File(uploadPath);
            if (!f2.exists()) {
                f2.mkdirs();
            }
            //存入数据库的路径
            String headPortraitPath = "";
            for (FileItem fileItem : fileItemList) {
                if (!fileItem.isFormField()) {
                    //是文件域
                    String fileName = fileItem.getName();
                    //获取原来文件的后缀
                    String suffix = fileName.substring(fileName.lastIndexOf("."));
                    //生成新的文件名,为防止重复,采用随机数
                    String destFileName = UUID.randomUUID().toString().replace("-", "");
                    
                    //存入数据库的路径拼接完毕,例如格式:随机文件名.txt
                    headPortraitPath = destFileName + suffix;
                    //写入硬盘的路径
                    uploadPath += headPortraitPath;
                    //获取输入流
                    InputStream is = fileItem.getInputStream();
                    //输出流
                    FileOutputStream fos = new FileOutputStream(uploadPath);
                    //将上传的文件写入指定路径
                    try {
                        byte[] buf = new byte[10240];
                        while (true) {
                            int realLen = is.read(buf, 0, buf.length);
                            if (realLen < 0) {
                                break;
                            }
                            fos.write(buf, 0, realLen);
                        }
                    } finally {
                        if (fos != null)
                            fos.close();
                        if (is != null)
                            is.close();
                    }
                } else {
                    //不是文件域,是普通控件
                    //获取输入框的名称
                    String fieldName = fileItem.getFieldName();
                    //获取输入框中的值
                    String fieldVal = fileItem.getString("utf-8");
                    //加入请求域中
                    req.setAttribute(fieldName, fieldVal);
                }
            }
            String username = (String) req.getAttribute("username");
            String password = (String) req.getAttribute("password");
            //验证参数是否合法,不为空
            boolean flag = userService.exam(username, password);
            if (flag) {
                //将数据存入数据库
                User user = new User();
                user.setUsername(username);
                user.setPassword(password);
                user.setHead_portrait_path(headPortraitPath);
                if (userService.save(user)) {
                    resp.sendRedirect(req.getContextPath()+"/login.jsp");
                }
            } else {
                resp.sendRedirect(req.getContextPath()+"/register.jsp");
            }
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    
    /**
     * 用户登录
     * @param req
     * @param resp
     */
    public void login(HttpServletRequest req, HttpServletResponse resp) {
        //获取数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        //验证是否存在该用户
        User user = new User();
        try {
            if (userService.exam(username, password)) {
                user.setUsername(username);
                user.setPassword(password);
                user = userService.getByUser(user);
                if (user.getHead_portrait_path() != null) {
                    HttpSession s1 = req.getSession();
                    s1.setAttribute("user", user);
                    resp.sendRedirect(req.getContextPath()+"/index.jsp");
                } else {
                    resp.sendRedirect(req.getContextPath()+"/login.jsp");
                }
            } else {
                resp.sendRedirect(req.getContextPath()+"/login.jsp");
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
}

博主絮语

千言万语不舍,但美好的时光总是短暂的,博主本周分享就到此结束了,本周博客主题: 文件上传

制作不易,博主愿与各位前辈大佬共学习,共前进,编程之路任重道远,艰辛,我们共前进,克服难关,挺过去,就是彩虹,风雨过后就是彩虹,加油,愿我们成为想要成为的人!

都看到这里了,不确定来个一键三连么~

我们下周见~

相关文章
|
11天前
|
Java
java引入本地 MultipartFile 实现多部分文件上传
在Java中,`MultipartFile`通常用于处理通过HTML表单上传的文件。但在某些情况下,需要直接从本地文件系统获取文件并上传。本文介绍如何创建一个实现了`MultipartFile`接口的本地类`LocalMultipartFile`,将本地文件转换为`MultipartFile`对象,简化文件上传流程。此方法适用于批量上传等场景,避免了表单上传的复杂性。代码示例展示了如何实现和使用该类进行文件上传操作。作者:华科云商小彭。链接:[稀土掘金](https://juejin.cn/post/7377559533785530431)。
70 18
|
12天前
|
存储 算法 Java
解锁“分享文件”高效密码:探秘 Java 二叉搜索树算法
在信息爆炸的时代,文件分享至关重要。二叉搜索树(BST)以其高效的查找性能,为文件分享优化提供了新路径。本文聚焦Java环境下BST的应用,介绍其基础结构、实现示例及进阶优化。BST通过有序节点快速定位文件,结合自平衡树、多线程和权限管理,大幅提升文件分享效率与安全性。代码示例展示了文件插入与查找的基本操作,适用于大规模并发场景,确保分享过程流畅高效。掌握BST算法,助力文件分享创新发展。
|
30天前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
38 0
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
230 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
2月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
119 34
|
3月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
73 3
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
113 9
|
3月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
133 2
|
3月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
297 2

热门文章

最新文章