使用servlet将图片保存到数据库中

news2024/11/19 1:34:38

一、导入jar包,配置properties文件(src路径下)

commons-fileupload-1.3.1.jar
commons-io-2.2.jar
druid-1.2.8.jar
mysql-connector-java-8.0.25.jar
servlet-api.jar

#   ????key-value???
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/数据库名
username=数据库用户名
password=数据库用户密码
# init size
initialSize=5
# max size
maxActive=10
maxWait=3000

二、用html写一个简易的网页

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>添加老师信息</h3>
<form action="teacherServlet" method="post" enctype="multipart/form-data">
    <input type="hidden" name="action" value="add">
    姓名:<input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    出生日期:<input type="date" name="birthday"><br/>
    头像:<input type="file" name="tx" ><br/>
    <input type="submit" value="添加">
</form>

</body>
</html>

三、根据表单数据建立好对应的数据库JDBC连接

详情见链接:https://blog.csdn.net/qq_62182919/article/details/142220224?sharetype=blogdetail&sharerId=142220224&sharerefer=PC&sharesource=qq_62182919&sharefrom=from_link

四、创建TeacherServlet ,完成请求响应

因为在上方表单要将图片以二进制字节流上传,所以用到了enctype=“multipart/form-data”
相对应的在Servlet中
@MultipartConfig // 一定要加注解

//  1.设置编码方式
@WebServlet("/teacherServlet")
@MultipartConfig            //  一定要加注解
public class TeacherServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("添加学生信息!");
            //  处理请求信息
            String name = req.getParameter("name");
            Integer age = Integer.parseInt(req.getParameter("age"));
            String date = req.getParameter("birthday");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date birthday = null;
            try {
                birthday = sdf.parse(date);
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
            //  获取头像的文件信息并进行处理
            Part part = req.getPart("tx");
            String filename = part.getSubmittedFileName();
            filename = UUID.randomUUID().toString().replace("-","")+"-"+filename;
            //  将图片上传到指定路径
            String path = "E:\\学习日记\\07javaEE课堂笔记\\img\\"+filename;
            //  上传
            part.write(path);
            //  把文件名作为数据保存到数据库之中
            Teacher teacher = new Teacher(name,age,birthday,filename);
            int num = new TeacherDao().addTeacher(teacher);
            if(num!=0){
                System.out.println("添加成功!");
                resp.sendRedirect("teacherServlet?action=selectAll");
            }else{
                resp.getWriter().write("<h1>添加失败!</h1>");
            }
    }
    }
        

五、根据数据库中保存的文件名预览保存在对应文件夹的图片servlet实现请求

//  预览图片
@WebServlet("/down")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //  1.设置编码方式
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //  2.处理请求信息
        String filename = req.getParameter("filename");
        //  3.以字节流的形式把图片响应给前端
        FileInputStream fin = new FileInputStream(new File("E:\\学习日记\\07javaEE课堂笔记\\img",filename));
        //  设置响应的图片是1预览还是下载到本地
        //  预览:resp.setHeader("Content-Disposition", "filename="+filename);
        //  下载:resp.setHeader("Content-Disposition", "attachment;filename="+filename);
        resp.setHeader("Content-Disposition", "filename="+filename);
        ServletOutputStream out = resp.getOutputStream();
        //  读写操作
        byte b[] = new byte[1024];
        int len = 0;
        while((len=fin.read(b))!=-1){
            out.write(b,0,len);
        }
        out.close();
        fin.close();
    }
}

六、简易的页面用来展示数据库中的数据

在另一个servlet中可以通过下面的响应请求的方式,将需要的网页直接编写出来(注意设置代码编写格式)
预览图片用到了请求 down
out.write(“”);

            PrintWriter out = resp.getWriter();
            out.write("<table border=1>");
            //  表头
            out.write("<tr><th>编号</th><th>姓名</th><th>年龄</th><th>出生日期</th><th>操作</th></tr>");
            //  表格内容
            //  连接数据库,查询所有的老师信息
            List<Teacher> teachers = new TeacherDao().findTeachers();
            for(Teacher teacher:teachers){
                out.write("<tr>");
                out.write("<td>"+teacher.getId()+"</td>");
                out.write("<td>"+teacher.getName()+"</td>");
                out.write("<td>"+teacher.getAge()+"</td>");
                out.write("<td>"+teacher.getBirthday()+"</td>");
                out.write("<td><img src='down?filename="+teacher.getTx()+"' width='200'></td>");
                out.write("<td><a href='teacherServlet?action=del&id="+teacher.getId()+"'>删除</a>"
//                        + "<a href='teacherServlet?action=update&id="+teacher.getId()+"&name="+teacher.getName()+"&age="+teacher.getAge()+"&birthday="+teacher.getBirthday()+"'>修改</a>"
                        + "</td>");
                out.write("</tr>");
            }
            out.write("</table>");
            out.write("<a href='add.html'>添加老师信息</a>");

项目路径如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优购电商小程序的设计与实现+ssm(lw+演示+源码+运行)

优购电商小程序 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对…

精选推荐!分享6款论文写作ai免费带附加文献

在当今学术研究和写作领域&#xff0c;AI论文写作工具已经成为不可或缺的助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究人员和学生产出高质量的论文。以下是六款免费且功能强大的AI论文写作工具推荐&#xff1a; 一、千笔-AIPassPaper 千笔-AIPassPaper是一款…

【试听开放中】新中地2406期GIS特训营同步,定制专属学习路线图+职业规划

很多地信相关专业的同学都知道 学习开发很重要&#xff1f;项目实战经验很重要 但是在面对学什么语言&#xff1f;掌握什么技术的时候 同学又就开始犯嘀咕&#xff0c;这么多&#xff0c;到底学什么&#xff1f; 今天听人说Java不错&#xff0c;想学 明天听人说Python前景…

掌握“问一问”策略,视频号流量轻松实现质的飞跃!

掌握“问一问”策略&#xff0c;视频号流量轻松实现质的飞跃&#xff01; 视频号新流量入口&#xff0c;微信问一问。如何玩转问一问功能&#xff0c;手把手操作教学。#视频号#微信#问一问#短视频#直播 市面上还有这么牛逼的一个流量隐藏入口&#xff0c;先看一下数据&#x…

算法工程师重生之第六天(四数相加II 赎金信 三数之和 四数之和 总结 )

参考文献 代码随想录 一、四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#x…

《Rocky Linux 的下载和安装详细步骤》

以下是 Rocky Linux 的下载和安装详细步骤&#xff1a; 下载&#xff1a; 1. 打开 Rocky Linux 的官方网站&#xff1a;https://rockylinux.org/ 2. 在首页找到“Download”&#xff08;下载&#xff09;选项&#xff0c;点击进入下载页面。 3. 在下载页面中&#xff0c;您…

【鸿蒙 HarmonyOS NEXT】使用屏幕属性display:获取屏幕宽高

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…

three.js工厂案例

最终效果图 给定html页面&#xff0c;作为tag标签展示 <body style"background-color: black;"><div id"tag"><div style"position:relative;width:400px;height:322px;color: #fff;"><img src"background.png"…

Vue3+TS项目封装一个公共的el-table组件二次封装

前言 支持动态传入列&#xff0c;列内容可以指定插槽&#xff0c;指定格式化显示 样式没太写&#xff0c;主要分享基础功能封装 效果 Table组件代码BaseTable.vue <template><el-table :data"data" border><template v-for"col in columns&q…

基于SpringBoot+Vue+MySQL的画师约稿平台系统

系统展示 用户界面 画师界面 管理员界面 系统背景 基于SpringBootVueMySQL的画师约稿平台系统的背景&#xff0c;主要源于数字艺术行业的快速发展与画师、客户双方需求的日益增长。在传统的约稿方式中&#xff0c;往往存在沟通效率低下、交易过程不透明等问题&#xff0c;这限制…

Pandas读取某列、某行数据——loc、iloc区别

loc&#xff1a;通过行、列的名称或标签来索引 iloc&#xff1a;通过行、列的索引位置来寻找数据 首先&#xff0c;我们先创建一个DataFrame生成数据 import pandas as pddata {a:[1,2,3,4,5],b:[6,7,8,9,10],c:[11,12,13,14,15] } data pd.DataFrame(data) print(data) 运行…

IO模型---BIO、NIO、IO多路复用、AIO详解

本篇将想给详细解释一下什么是BIO、NIO、IO多路复用以及AIO~ 同步的阻塞(BIO)和非阻塞(NIO)的区别 BIO&#xff1a;线程发来IO请求后&#xff0c;一直阻塞着IO线程&#xff0c;需要缓冲区这边数据准备好之后&#xff0c;才会进行下一步的操作。 举个&#x1f330;&#xff1…

2024秋季云曦开学考

web ezezssrf 打开环境&#xff0c;代码审计 看起来有点多&#xff0c;要绕过五层 第一层&#xff1a;存在弱比较&#xff0c;使用数组或0e绕过 yunxi[]1&wlgf[]2 yunxis878926199a&wlgfs155964671a 第二层&#xff1a;存在强比较&#xff0c;此处使用string限制…

c++(继承、模板进阶)

一、模板进阶 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中…

装饰器模式decorator

学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/decorator 将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为 调用过程 当你调用 encoded.writeData(salaryRecords); 时&#xff0c;控制流首先进入 CompressionDecorator 的 writeData …

微信小程序原生支持TS、LESS、SASS能力探究

文章目录 原生支持开始使用旧项目新建项目TS声明文件更新 功能说明less 使用全局变量sass 使用全局变量 可以参考原文 在之前开发小程序中&#xff0c;无法使用 less/sass 等 css 预编译语言&#xff0c;也无法使用 TS 进行开发&#xff0c;但在最新的编辑器版本中&#xff0c…

面向对象程序设计之模板进阶(C++)

在之前我出过一篇博客介绍了模版的初阶:面向对象程序设计(C)模版初阶&#xff0c;接下来我们将进行模版的进阶学习&#xff0c;介绍关于更多模版的知识 1.非类型模版参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或…

如何处理DDOS攻击问题

随着信息技术的飞速发展&#xff0c;网络已成为现代社会不可或缺的一部分&#xff0c;极大地便利了个人社交和商业活动。然而&#xff0c;网络空间在创造无限机遇的同时&#xff0c;也潜藏着诸多威胁&#xff0c;其中分布式拒绝服务攻击&#xff08;DDoS&#xff0c;Distribute…

利用Idea远程调试

注意&#xff1a;远程调试不要应用在正式环境中&#xff0c;即便是测试环境也只建议在开发网段使用 在实际的开发过程中&#xff0c;为了验证测试环境的一些问题&#xff0c;且问题在本地不可复现&#xff0c;可以使用远程debug的形式来进行问题定位&#xff0c;而不用循环进行…

如何使用智能合约铸造 NFT —— 以 NftMarket 合约为例

系列文章目录 使用Pinata在IPFS上存储NFT图片的实践&#x1f6aa; scaffold-eth-2使用详细教程&#x1f6aa; 文章目录 系列文章目录前言一、使用到的 OpenZeppelin 库1.1. ERC721 合约1.2. ERC721URIStorage 合约1.3. Counters 合约 二、编写合约代码2.1. 准备NFT元数据2.2. …