spring boot实现上传图片并在页面上显示及遇到的问题小结

下面我会详细讲解“spring boot实现上传图片并在页面上显示及遇到的问题小结”的完整攻略。

1. 准备工作

在开始实现上传图片并在页面上显示之前,我们需要先准备好以下的环境和工具:

2. 实现上传图片

在Spring Boot中实现上传图片的方式很多,这里我们以常用的MultipartFile为例。假设我们的上传页面是/upload,在这个页面中,用户可以选择要上传的图片,然后点击上传按钮,将图片上传到服务器。接下来是实现代码:

2.1 HTML页面代码

首先是上传页面的HTML代码,使用了Bootstrap和Thymeleaf的模板引擎:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>上传图片</title>
  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.5.0/css/bootstrap.min.css">
  <script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<div class="container mt-3">
  <h2>上传图片</h2>
  <form th:action="@{/upload}" th:method="post" enctype="multipart/form-data">
    <div class="form-group">
      <label>选择图片</label>
      <input type="file" name="file" class="form-control-file" accept="image/png, image/jpeg">
    </div>
    <button type="submit" class="btn btn-primary">上传</button>
  </form>
</div>
</body>
</html>

关键代码:

  • enctype="multipart/form-data":用于支持文件上传。
  • accept="image/png, image/jpeg":限制只能上传PNG或JPEG格式的图片。

2.2 Controller的实现

然后是Controller的实现代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class UploadController {
    @Value("${file.upload-dir}")
    private String uploadDir;

    @GetMapping("/upload")
    public String uploadPage() {
        return "upload";
    }

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadFile(@RequestParam("file") MultipartFile file, Model model) throws IOException {
        // 上传文件
        String fileName = file.getOriginalFilename();
        File targetFile = new File(uploadDir + File.separator + fileName);
        FileCopyUtils.copy(file.getBytes(), targetFile);

        // 将文件名放入Model返回页面
        model.addAttribute("fileName", fileName);
        return "result";
    }
}

关键代码:

  • @RequestParam("file") MultipartFile file:用于接收前端上传的文件。
  • FileCopyUtils.copy(file.getBytes(), targetFile);:将上传的文件保存到指定的目录。

2.3 配置文件

我们需要在配置文件中配置文件上传目录:

file.upload-dir=/path/to/your/upload/dir

2.4 上传成功页面

最后是上传成功页面(返回的Model中带有文件名):

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>上传成功</title>
  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-3">
  <h2>上传成功</h2>
  <div class="alert alert-success" role="alert">
    <p>您上传的文件是:<span th:text="${fileName}"></span></p>
    <p>您可以在以下位置查看您的文件:</p>
    <pre class="alert-pre border bg-light p-2"><code>/path/to/your/upload/dir/<span th:text="${fileName}"></span></code></pre>
  </div>
</div>
</body>
</html>

OK,当我们访问/upload页面,选择好图片并上传之后,就会自动跳转到上传成功页面,展示上传的文件名和保存路径。

3. 实现显示图片

实现上传图片后,我们还需要将上传的图片显示在页面上。这里为了方便,我们使用一个简单的图片预览功能,当用户选择上传图片后,会在上传页面上预览显示该图片。

3.1 HTML页面代码

首先是上传页面的HTML代码,我们需要在页面上加入一个img标签,在用户选择图片后更新该img的src属性,从而达到实时预览图片的效果。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>上传图片</title>
  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.5.0/css/bootstrap.min.css">
  <script src="https://cdn.staticfile.org/jquery/3.5.1/jquery.min.js"></script>
  <script>
    // 实时预览图片
    $(function () {
      $("#file").change(function () {
        var img = $("#preview");
        img.attr("src", window.URL.createObjectURL(this.files[0]));
      });
    });
  </script>
</head>
<body>
<div class="container mt-3">
  <h2>上传图片</h2>
  <form th:action="@{/upload}" th:method="post" enctype="multipart/form-data">
    <div class="form-group">
      <label>选择图片</label>
      <input type="file" id="file" name="file" class="form-control-file" accept="image/png, image/jpeg">
    </div>
    <div class="form-group">
      <img id="preview" src="#" alt="预览" class="img-fluid" style="max-width: 100%">
    </div>
    <button type="submit" class="btn btn-primary">上传</button>
  </form>
</div>
</body>
</html>

关键代码:

  • $(function () {...});:利用jQuery实现实时对img标签的属性src进行更新。

3.2 Controller的实现

然后是Controller的实现代码,我们需要在上传成功后,将上传的图片文件路径保存在Model中,返回到展示图片的页面,在页面中通过路径,显示出上传的图片。

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class UploadController {
    @Value("${file.upload-dir}")
    private String uploadDir;

    @GetMapping("/upload")
    public String uploadPage() {
        return "upload";
    }

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadFile(@RequestParam("file") MultipartFile file, Model model) throws IOException {
        // 上传文件
        String fileName = file.getOriginalFilename();
        File targetFile = new File(uploadDir + File.separator + fileName);
        FileCopyUtils.copy(file.getBytes(), targetFile);

        // 将文件名放入Model返回页面
        model.addAttribute("fileName", fileName);
        model.addAttribute("filePath", "/uploads/" + fileName);
        return "result";
    }
}

关键代码:

  • model.addAttribute("filePath", "/uploads/" + fileName);:将上传的文件路径带入Model,供图片展示页面获取。

3.3 静态文件配置

接下来,我们需要在Spring Boot的配置文件中,配置静态资源目录。在配置文件中,我们添加以下配置:

spring.resources.static-locations=file:/path/to/your/upload/dir/

这里,我们设置静态资源目录为上传的图片所在的目录。

3.4 图片展示页面

最后,我们需要创建一个图片展示页面,用于展示上传的图片。这个页面需要使用到Bootstrap和Thymeleaf的模板引擎,而图片的展示使用了img标签。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>上传成功</title>
  <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-3">
  <h2>上传成功</h2>
  <div class="row">
    <div class="col-md-3">
      <div class="card">
        <img th:src="@{${filePath}}" class="card-img-top" alt="...">
        <div class="card-body">
          <h5 class="card-title" th:text="${fileName}"></h5>
        </div>
      </div>
    </div>
  </div>
</div>
</body>
</html>

关键代码:

  • th:src="@{${filePath}}":利用Thymeleaf实现图片路径的动态获取。

这样,我们就实现了上传图片并在页面上显示的功能。

4. 遇到的问题小结

在实现上传图片并在页面上显示的过程中,我们可能会遇到以下问题:

  • 上传文件大小限制问题:可以在Spring Boot的配置文件中,设置MultipartFile的上传文件大小限制。
  • 图片文件格式限制问题:可以在HTML页面中设置accept属性限制文件格式,也可以在Controller中使用MultipartFile的getContentType()方法限制,或者使用第三方工具。

总结起来,这个功能的主要难点点有:

  • 如何支持文件上传并处理文件:这个问题通过使用MultipartFile实现较为方便。
  • 如何将上传的文件名或路径返回到页面:这个问题需要使用Controller将上传后的文件名或路径放入Model中,然后页面通过${}表达式获取。
  • 如何显示图片:这个问题需要在上传成功后,将图片路径放入Model中,然后在展示图片的页面,使用img标签进行显示。

以上是实现上传图片并在页面上显示的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring boot实现上传图片并在页面上显示及遇到的问题小结 - Python技术站

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

相关文章

  • springboot集成dubbo注解版的示例代码

    下面我来详细讲解“springboot集成dubbo注解版的示例代码”的完整攻略,过程中我将会给出两条示例代码。 概述 Dubbo是一个高性能、轻量级的开源Java框架,目的是为了提供完整的RPC框架,包括服务注销和发现,以及协议、负载均衡、路由、监控等能力。SpringBoot是一个基于Spring的快速开发的框架,它使Spring应用的开发变得容易。本教…

    Java 2023年5月19日
    00
  • 两个listbox实现选项的添加删除和搜索

    要实现选项的添加、删除和搜索,可以使用两个listbox控件来完成。其中,一个listbox用于显示已选择的选项,另一个listbox用于显示可选择的候选项。 下面是具体的步骤: 1.创建两个listbox控件,一个用于显示已选择的选项,另一个用于显示可选择的候选项。同时,还需要创建一些按钮和文本框用于添加、删除和搜索选项。 2.将可选择的候选项添加到第一个…

    Java 2023年6月15日
    00
  • Java中ArrayList的使用详细介绍

    可以的,下面是关于Java中ArrayList使用详细介绍的完整攻略。 什么是ArrayList? ArrayList是Java中的一个动态数组,具有自动扩容功能。与Java中的数组相比,ArrayList能够更加灵活地操作元素,而且能够自动处理数组的长度。 如何使用ArrayList? 要使用ArrayList,你需要遵循以下步骤: 1. 导入java.u…

    Java 2023年5月26日
    00
  • 浅析Spring的JdbcTemplate方法

    浅析Spring的JdbcTemplate方法 什么是JdbcTemplate JdbcTemplate是Spring Framework提供的JDBC抽象层工具类之一,封装了JDBC操作的常用方法,以达到简化JDBC代码的目的。 JdbcTemplate的优点 使用JdbcTemplate进行JDBC操作,可以带来以下好处: 不必关心JDBC的繁琐的操作,…

    Java 2023年5月20日
    00
  • Adobe Acrobat DC怎么使用?Adobe Acrobat DC下载安装图文教程

    如果想要使用 Adobe Acrobat DC 进行 PDF 文件的编辑和管理,可以按照以下步骤进行下载、安装和使用: 下载安装 Adobe Acrobat DC 打开 Adobe 官网(https://www.adobe.com/),选择“Acrobat”选项,并点击“开始免费试用”或“购买”按钮。 如果选择免费试用,则需要输入个人信息和支付信息,之后会获…

    Java 2023年6月15日
    00
  • 带你粗略了解Java数组的使用

    带你粗略了解Java数组的使用 什么是数组? 数组是一种存储数据的集合。它可以存储多个同类型的数据元素,并且这些元素按照一定顺序排列。Java数组是一种容器,可以存储固定大小的同类型元素。数组可以存储基本数据类型和对象,但必须是同一个类型。 声明和初始化数组 声明一个数组需要指定数据类型和数组名称。 //声明一个整型数组 int[] arr; 初始化数组需要…

    Java 2023年5月26日
    00
  • Java经典面试题汇总:网络编程

    Java经典面试题汇总: 网络编程是一个重要的主题,需要我们掌握相关的知识点,下面是该话题的完整攻略: 1. 网络编程基础 在Java中,我们可以使用Socket和ServerSocket来实现网络编程。 1.1 Socket的使用 客户端可以使用Socket来连接到服务器,同时服务器端也可以使用Socket来处理客户端请求。 Java中的Socket类提供…

    Java 2023年5月23日
    00
  • java语言自行实现ULID过程底层原理详解

    Java语言自行实现ULID过程底层原理详解 什么是ULID? ULID全称为Universally Unique Lexicographically Sortable Identifier,即通用唯一字典序可排序标识符。它是一种唯一标识符,适合在分布式系统中用于唯一标识事物或对象。 在ULID中,时间戳是最重要的信息,其中包括48位的时间戳和80位的随机数…

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