Java web实现头像上传以及读取显示

下面我将为您详细讲解如何使用Java web实现头像上传以及读取显示的完整攻略。

1. 准备工作

在开始实现之前,需要确保您已经有如下几个基本的环境:

  • 开发环境:Eclipse或者IntelliJ IDEA
  • 服务器环境:Tomcat
  • 数据库:MySQL

同时,需要引入如下两个库:

  • commons-fileupload-1.3.1.jar
  • commons-io-2.6.jar

您可以通过在项目中的pom.xml文件中加入如下代码完成引入:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

2. 前端页面

首先,在前端页面中需要添加文件上传的表单:

<form action="upload.do" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
</form>

这里的name属性必须为fileenctype属性必须为multipart/form-data,这样才能支持文件上传。

3. 后台实现

在后台,我们需要编写一个Servlet来处理上传的文件:

public class UploadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            // 获取上传的文件
            Part part = request.getPart("file");
            // 获取文件名
            String fileName = part.getSubmittedFileName();
            // 保存文件到硬盘
            String savePath = request.getServletContext().getRealPath("/uploads");
            File file = new File(savePath + File.separator + fileName);
            part.write(file.getAbsolutePath());
            // 将文件名保存到数据库
            Connection conn = DBUtil.getConnection();
            String sql = "update user set avatar = ? where id = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, fileName);
            ps.setInt(2, 1);
            ps.executeUpdate();
            // 关闭连接
            DBUtil.close(conn, ps, null);
            // 页面跳转
            request.getRequestDispatcher("/profile.jsp").forward(request, response);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

在这里,我们首先通过request.getPart("file")方法获取上传的文件,然后通过part.write()方法将文件保存到指定的文件夹中,最后将文件名保存到数据库中。

在这里,我演示了将文件保存到项目根目录下的uploads文件夹中。您也可以根据您的实际需求来修改。

接下来,我们需要在程序中读取上传的图片,通过如下代码实现:

Connection conn = DBUtil.getConnection();
String sql = "select avatar from user where id = 1";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    String fileName = rs.getString("avatar");
    String savePath = request.getServletContext().getRealPath("/uploads");
    File file = new File(savePath + File.separator + fileName);
    InputStream is = new FileInputStream(file);
    byte[] bytes = IOUtils.toByteArray(is);
    // 将图片响应给前端
    response.setContentType("image/jpeg");
    response.setContentLength(bytes.length);
    ServletOutputStream sos = response.getOutputStream();
    sos.write(bytes);
    sos.flush();
    sos.close();
}
// 关闭连接
DBUtil.close(conn, ps, rs);

如上面的代码所示,我们首先从数据库中读取出保存的文件名,然后通过getRealPath()方法获取到文件存储的路径,再用File类读取文件,并将文件转换为字节数组,最后响应给前端。

这样,我们就成功的实现了头像上传以及读取显示的功能了。

4. 示例代码

为了更好地帮助您理解,我提供了一个示例代码(使用了JSP进行展示):

// UploadServlet.java
@WebServlet("/upload.do")
public class UploadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            // 获取上传的文件
            Part part = request.getPart("file");
            // 获取文件名
            String fileName = part.getSubmittedFileName();
            // 保存文件到硬盘
            String savePath = request.getServletContext().getRealPath("/uploads");
            File file = new File(savePath + File.separator + fileName);
            part.write(file.getAbsolutePath());
            // 将文件名保存到数据库
            Connection conn = DBUtil.getConnection();
            String sql = "update user set avatar = ? where id = ?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, fileName);
            ps.setInt(2, 1);
            ps.executeUpdate();
            // 关闭连接
            DBUtil.close(conn, ps, null);
            // 页面跳转
            request.getRequestDispatcher("/profile.jsp").forward(request, response);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

// ProfileServlet.java
@WebServlet("/profile.do")
public class ProfileServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            Connection conn = DBUtil.getConnection();
            String sql = "select avatar from user where id = 1";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                String fileName = rs.getString("avatar");
                String savePath = request.getServletContext().getRealPath("/uploads");
                File file = new File(savePath + File.separator + fileName);
                InputStream is = new FileInputStream(file);
                byte[] bytes = IOUtils.toByteArray(is);
                // 将图片响应给前端
                response.setContentType("image/jpeg");
                response.setContentLength(bytes.length);
                ServletOutputStream sos = response.getOutputStream();
                sos.write(bytes);
                sos.flush();
                sos.close();
            }
            // 关闭连接
            DBUtil.close(conn, ps, rs);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

// profile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>头像上传示例</title>
</head>
<body>
    <h1>头像上传示例</h1>
    <form action="upload.do" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <input type="submit" value="上传">
    </form>
    <hr>
    <h2>我的头像</h2>
    <img src="profile.do" width="200" height="200">
</body>
</html>

希望我的回答能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java web实现头像上传以及读取显示 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 深入了解Java中循环结构的使用

    深入了解 Java 中循环结构的使用 循环结构是编程中非常重要的一个概念,Java 中包含多种不同类型的循环结构。掌握这些循环结构可以帮助我们更高效地进行编程。下面是深入了解 Java 中循环结构的完整攻略。 for 循环 for 循环是最常用的循环结构之一。它允许我们按照在代码中指定的条件来重复执行特定的代码块。for 循环的语法如下: for (init…

    Java 2023年5月26日
    00
  • IDEA下创建SpringBoot+MyBatis+MySql项目实现动态登录与注册功能

    下面我将为您详细讲解“IDEA下创建SpringBoot+MyBatis+MySql项目实现动态登录与注册功能”的完整攻略。 环境准备 首先,我们需要在本地环境中安装好如下软件: JDK、IDEA、Maven、MySQL等开发环境 SpringBoot、MyBatis、MySql等相关依赖包 创建SpringBoot项目 步骤如下: 打开IDEA,选择 Cr…

    Java 2023年5月20日
    00
  • Spring Boot Logging Level设置为off时的Bug

    为了更好的解释“Spring Boot Logging Level设置为off时的Bug”问题以及解决方案,我们需要先了解以下几个问题: 什么是Logging Level Spring Boot默认的Logging Level设置 Logging Level为off时会出现什么问题 如何避免Logging Level为off导致的问题 现在我们按照这个顺序来…

    Java 2023年5月20日
    00
  • CAS操作的实现原理是什么?

    CAS(Compare And Swap)是一种并发控制机制,用于保证多线程并发修改时的数据一致性。它主要包括三个操作数:内存地址V、旧的预期值A和新的值B。当且仅当内存地址V的值和预期值A相同时,才把新的值B赋值给内存地址V,否则就什么都不做。下面就来详细讲解一下CAS操作的实现原理: CAS操作的实现原理 在计算机能够完成CAS操作的原理中,有两个非常重…

    Java 2023年5月10日
    00
  • Java easyexcel使用教程之导出篇

    Java easyexcel使用教程之导出篇攻略 背景介绍 在实际开发中,经常会涉及到将数据导出为Excel文件的需求。而 EasyExcel 是一款由阿里巴巴开源的Java Excel解析/生成工具包,使用简单,支持大量数据导出,广受开发者喜欢。 本篇攻略主要针对EasyExcel的导出功能进行详细讲解,包括使用方法、参数配置和示例说明等内容。 使用方法 …

    Java 2023年6月2日
    00
  • jdbc实现图书馆借阅系统

    JDBC实现图书馆借阅系统 简介 JDBC是Java Database Connectivity的缩写,是Java语言访问数据库的标准API,它提供了一套标准的Java接口,用于访问各种关系型数据库系统。本文将介绍如何使用JDBC实现图书馆借阅系统。 步骤 1. 加载数据库驱动 为了使用JDBC访问数据库,我们需要先加载数据库驱动。在这里以MySQL数据库为…

    Java 2023年6月16日
    00
  • JavaWeb实现邮件发送功能

    下面是JavaWeb实现邮件发送功能的完整攻略: 1. 准备工作 首先需要确保在本地或服务器上已经安装了Java环境和JavaMail API。 Java环境的安装可以参考官方文档:https://www.java.com/zh-CN/download/help/download_options.html JavaMail API的下载可以在官方网站上找到:…

    Java 2023年6月16日
    00
  • Java Lock接口实现原理及实例解析

    Java Lock接口实现原理 Java Lock接口是Java中线程同步机制的一个重要组件。它可以替代传统的synchronized关键字实现线程同步,其主要实现原理是通过对一段代码区域进行加锁和解锁来实现线程同步。 Java Lock接口与synchronized关键字最大的区别就是它的锁具有可重入性。所谓可重入性,是指一个线程的已经获取的锁再次获取时会…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部