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中,顺序结构是最基本的结构。 public class Example1 { …

    Java 2023年5月26日
    00
  • Hadoop中的压缩与解压缩案例详解

    下面就为您详细讲解“Hadoop中的压缩与解压缩案例详解”的完整攻略。 什么是Hadoop中的压缩与解压缩? 在Hadoop中,由于数据量通常都很大,为了提高数据的存储效率和运行效率,我们经常需要将数据进行压缩。同时,在MapReduce的过程中,也需要对数据进行解压缩以方便处理。 Hadoop支持多种数据压缩格式,包括Gzip、Bzip2、LZO等。在使用…

    Java 2023年5月20日
    00
  • Java反射概念与使用实例代码

    Java反射是Java语言自带的一种强大的机制,允许在运行时动态地获取类的信息、访问或修改类的属性和方法等。本文将详细讲解Java反射的概念和使用,包含以下内容: 反射概述 反射实现方式 反射的作用与优缺点 反射使用的实例代码 反射概述 Java反射(Reflection)是Java语言中的一种机制。它可以让我们在运行时动态地获取类的信息、访问或修改类的属性…

    Java 2023年5月30日
    00
  • SpringBoot依赖注入的三种方式

    下面是关于Spring Boot依赖注入的三种方式的详细讲解: 1. 构造器注入 构造器注入是为Bean的属性提供值的一种方式。当容器实例化Bean时,Spring容器会将与Bean依赖关系具有兼容性的Bean传递给它的构造器,并初始化Bean的属性。 这种方式适用于具有重要和必需依赖关系的Bean,并且确保了Bean初始化后的完整性。 下面是一个示例: @…

    Java 2023年5月15日
    00
  • jsp测试函数的运行速度方法

    当我们需要测试一个JSP函数的运行速度时,一种简单有效的方法是使用Java的System.currentTimeMillis()方法,通过计算函数的开始和结束时间来统计函数的执行时间。 下面是实现方法的步骤: 第一步:定义方法 首先,我们需要为即将进行测试的函数添加一个计时器,以便在函数执行开始和结束时记录时间。可以添加一个名为“currentTime”的变…

    Java 2023年6月15日
    00
  • Java实现的求逆矩阵算法示例

    Java实现的求逆矩阵算法示例 什么是逆矩阵 矩阵A的逆矩阵记为A-1,它是一个与A相乘后得到单位矩阵的矩阵。在一般的情况下,只有方阵才有逆矩阵。 矩阵求逆算法 对于一个n阶方阵A,它的行列式为det(A)。 如果det(A)不等于0,则A可逆,它的逆矩阵B为: B = 1/det(A) * adj(A) 其中,adj(A)是A的伴随矩阵,它是由矩阵A的每个…

    Java 2023年5月19日
    00
  • java配置dbcp连接池(数据库连接池)示例分享

    下面我将为您提供关于“Java配置DBCP连接池(数据库连接池)示例分享”的完整攻略: 什么是DBCP连接池 DBCP连接池是一个Java SQL连接池管理包,用于管理数据库连接的池。它使用JDBC连接接口,并管理连接,可重用连接的对象。 使用DBCP连接池的好处 DBCP连接池的好处如下: 连接池管理:可以重复使用现有的数据库连接,从而大大提高系统的性能和…

    Java 2023年5月19日
    00
  • EL表达式截取字符串的函数说明

    下面是关于EL表达式截取字符串的函数说明的完整攻略: EL表达式截取字符串的函数说明 在EL表达式中,有两个函数可以用来截取字符串:fn:substring()和fn:substringAfter()。下面我们来详细讲解一下这两个函数的用法和示例。 fn:substring() fn:substring()函数可以用来截取字符串中的一段子串,它的语法如下: …

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