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日

相关文章

  • Win2003平台上jsp虚拟主机环境的架设(IIS6+J2SDK+resin)

    这里提供Win2003平台上jsp虚拟主机环境的架设攻略,该环境采用IIS6+J2SDK+Resin,具体步骤如下: 准备工作 下载并安装J2SDK(Java SE Development Kit) 下载Resin,并解压到指定目录下。 下载并安装IIS6。 安装Resin 进入Resin解压后的主目录,找到bin目录。 右键点击resin.exe,选择“以…

    Java 2023年6月15日
    00
  • Java Optional实践(小结)

    Java Optional实践(小结) 什么是Java Optional? Optional 是 Java 8 引入的一个新特性,可以作为一种容器,对空值的处理提供更为优美的解决方案。 通常情况下我们在使用 Java 的时候经常会遇到 NullPointerException,就比如一个变量为 null,我们调用其方法时就可能会抛出该异常。而 Optiona…

    Java 2023年5月26日
    00
  • Java原生方法实现 AES 算法示例

    下面我将为您详细讲解“Java原生方法实现 AES 算法示例”的完整攻略。 什么是AES算法 AES(Advanced Encryption Standard)高级加密标准是一种对称加密算法,也是当前使用最广泛的加密算法之一。它可以加密128位、192位和256位的数据,并且安全性比DES更高。 Java中的AES算法实现 Java内置了AES算法的实现,我…

    Java 2023年5月18日
    00
  • Java算法之最长公共子序列问题(LCS)实例分析

    Java算法之最长公共子序列问题(LCS)实例分析 算法简介 最长公共子序列(Longest Common Subsequence,LCS)问题是指:给定两个序列X和Y,找出X和Y的最长公共子序列。 例如,若X=a,b,c,b,d,a,b,Y=b,d,c,a,b,a,则X和Y的最长公共子序列为b,c,a,b,长度为4。 算法思想 LCS问题可以使用动态规划的…

    Java 2023年5月19日
    00
  • 详解Struts2中json 相互引用死循环解决办法

    下面是详解Struts2中json 相互引用死循环解决办法的完整攻略。 简介 在 Struts2 中,使用 JSON 返回数据时,如果包含相互引用的对象,就会出现死循环的情况。这是因为在序列化时,对象互相引用,导致 Gson 序列化器无法判断对象的终止条件从而产生栈溢出。解决这个问题的方法是给予 JSON 序列化器一些帮助,在序列化时忽略相互引用的部分。 解…

    Java 2023年5月20日
    00
  • spring boot与spring mvc的区别及功能介绍

    区别: Spring Boot和Spring MVC都是Spring框架的一部分。Spring MVC是一种基于MVC(Model-View-Controller)的Web框架,用于构建Web应用程序,而Spring Boot则是一个用于简化Spring应用程序开发的框架,它可以在开发过程中自动配置和管理一些常见的Spring功能,而无需进行手动配置。因此,…

    Java 2023年5月15日
    00
  • 详解JNI到底是什么

    JNI全称为Java Native Interface,是Java语言与其他编程语言(如C、C++)进行交互的接口。JNI可以使Java程序通过调用本地(C、C++)编写的程序,实现高效的、与操作系统直接交互的功能。下面详细讲解JNI到底是什么,让你对JNI有更深刻的理解和认识。 什么是JNI? JNI是Java的一部分,是Java语言本身提供的一个开发工具…

    Java 2023年5月26日
    00
  • SpringBoot 整合Security权限控制的初步配置

    下面就来为大家详细讲解 SpringBoot 整合 Security 权限控制的初步配置。 1. 引入依赖 首先,在项目的 pom.xml 文件中,我们需要引入 Spring Security 的依赖,具体代码如下: <!– Spring Security –> <dependency> <groupId>org.sp…

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