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

yizhihongxing

下面我将为您详细讲解如何使用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运行windows的cmd命令简单代码

    下面是“Java运行Windows的cmd命令简单代码”的完整攻略。 1. Windows中运行cmd命令 在Windows操作系统中,可以通过cmd命令行来执行各种操作系统命令,又称为“控制台”或“命令提示符”。可以通过Java程序来在Windows中运行cmd命令,常用的方式是借助Runtime类或ProcessBuilder类来实现。 2. 使用Run…

    Java 2023年5月23日
    00
  • springmvc如何进行异常处理

    Spring MVC可以通过统一的异常处理机制来处理应用程序中遇到的异常,统一处理异常可以使应用程序更加健壮,并且在开发过程中可以统计异常信息,方便排查错误。 Spring MVC框架中异常处理是通过HandlerExceptionResolver接口来处理的,在这个接口中我们可以自定义异常处理的方式,这个接口中有两个非常重要的方法:resolveExcep…

    Java 2023年5月27日
    00
  • 如何使用JFrame完成动态模拟时钟

    使用JFrame完成动态模拟时钟的攻略可以分为以下几个步骤: 1. 导入Swing包 使用JFrame需要导入Swing包,可以在文件头添加以下代码: import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.Timer; import java.awt.Graphics…

    Java 2023年5月26日
    00
  • 图解Eclipse j2ee开发环境的搭建过程

    图解Eclipse J2EE开发环境的搭建过程 简介 本教程介绍如何使用Eclipse IDE搭建J2EE开发环境。J2EE是Java 2 Enterprise Edition的缩写,是Java平台上使用最广泛的企业级应用开发技术之一。 步骤 第一步:安装Java JDK 确定已经安装Java JDK,否则需要先下载并安装Java JDK。可访问官方网站Ja…

    Java 2023年5月26日
    00
  • 使用Filter过滤器中访问getSession()要转化

    在使用Filter过滤器过程中,访问getSession()方法时需要进行类型转换。因为getSession()方法在ServletRequest接口和HttpServletRequest类中都存在,然而在特定情况下过滤器可能无法确定当前请求是一种类型还是另一种类型的Session。 在这种情况下,我们需要对ServletRequest进行类型转换。将Ser…

    Java 2023年5月20日
    00
  • Windows Vista系统常用术语列表

    我们来详细讲解一下“Windows Vista系统常用术语列表”的完整攻略。 1. 什么是“Windows Vista系统常用术语列表”? “Windows Vista系统常用术语列表”是指在使用Windows Vista操作系统时,可能会遇到的一些常用术语,例如“任务栏”、“控制面板”、“系统还原”等等。 2. “Windows Vista系统常用术语列表…

    Java 2023年5月30日
    00
  • java简单快速排序实例解析

    Java简单快速排序实例解析 快速排序是一种常用的排序算法,其本质是通过不断地把数列分成两个部分,分别进行递归排序,最终完成整个数列的排序。 实现思路 快速排序的实现思路如下: 选择一个基准元素,在数列中选择一个数作为基准元素pivot,一般选择第一个或者最后一个元素; 分割数组,将数列中所有小于基准元素的数放在它的左侧,所有大于基准元素的数放在它的右侧; …

    Java 2023年5月19日
    00
  • Spring security用户URL权限FilterSecurityInterceptor使用解析

    下面是关于Spring security用户URL权限FilterSecurityInterceptor使用解析的完整攻略。 内容概述 Spring Security作为一个强大的安全框架,自然有着很多功能和API。其中,URL访问权限控制是一项非常核心和基础的功能。FilterSecurityInterceptor就是Spring Security框架中用…

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