SpringBoot的图片上传

简介

该文档旨在介绍一个基于Spring Boot框架的简单文件上传功能的实现方式。本文档将详细介绍相关代码的功能和配置以及如何使用它们。

样例

在这里插入图片描述

技术栈

  • Spring Boot:一个用于快速开发基于Spring的应用程序的框架。
  • Thymeleaf:一个用于在Web应用程序中创建动态内容的Java模板引擎。
  • YAML:一种人类可读的数据序列化语言。

文件结构

- upload:存放上传的文件。
- src
  - main
    - java
      - com.example
        - controller
          - ImageUploadController.java:处理文件上传请求的控制器类。
    - resources
      - static:存放静态资源文件。
      - templates
        - index.html:文件上传表单页面。
      - application.yml:配置文件,指定了文件上传路径。

文件上传功能介绍

文件上传功能允许用户通过一个简单的界面上传图片,并提供了显示已上传图片的链接以及预览功能。

代码解析

1. ImageUploadController.java
@Controller
public class ImageUploadController {

    // 从配置文件中注入上传路径
    @Value("${upload.path}")
    private String uploadDir;

    // 显示文件上传表单页面
    @GetMapping("/")
    public String showUploadForm() {
        return "index";
    }

    // 处理文件上传请求
    @PostMapping("/upload")
    public String handleFileUpload(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes) {
        if (file.isEmpty()) {
            redirectAttributes.addFlashAttribute("message", "文件为空,请重新上传!");
            return "redirect:/";
        }
        try {
            // 生成一个唯一的文件名
            String newFileName = UUID.randomUUID().toString();
            // 获取文件原始名称
            String originalFilename = StringUtils.cleanPath(file.getOriginalFilename());
            // 提取文件后缀名
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            newFileName = newFileName + suffix;

            // 创建上传文件夹的路径对象
            Path uploadPath = Paths.get(uploadDir);
            // 如果上传文件夹不存在,创建该文件夹
            if (!Files.exists(uploadPath)) {
                Files.createDirectories(uploadPath);
            }
            // 上传文件的完整路径
            Path filePath = uploadPath.resolve(newFileName);

            // 将上传的文件内容写入到磁盘
            try (InputStream inputStream = file.getInputStream();
                 OutputStream outputStream = Files.newOutputStream(filePath)) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, bytesRead);
                }
            }

            // 构建上传文件的URL
            String fileUrl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/upload/").path(newFileName).toUriString();

            // 将上传成功的消息和文件链接放入重定向属性中
            redirectAttributes.addFlashAttribute("message", "You successfully uploaded '" + file.getOriginalFilename() + "'");
            redirectAttributes.addFlashAttribute("fileUrl", fileUrl);

        } catch (IOException e) {
            e.printStackTrace();
        }

        // 重定向回上传页面
        return "redirect:/";
    }

    // 处理获取已上传文件的请求,提供文件下载功能
    @GetMapping("/upload/{fileName:.+}")
    @ResponseBody
    public ResponseEntity<Resource> serveFile(@PathVariable String fileName) {
        Resource file = loadFileAsResource(fileName);
        return ResponseEntity.ok()
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
                .contentType(MediaType.IMAGE_JPEG)
                .body(file);
    }

    // 加载已上传的文件资源
    private Resource loadFileAsResource(String fileName) {
        try {
            // 获取文件路径
            Path filePath = Paths.get(uploadDir).resolve(fileName).normalize();
            // 根据文件路径创建资源对象
            Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri());
            // 如果资源存在,返回资源对象
            if (resource.exists()) {
                return resource;
            } else {
                throw new RuntimeException("File not found " + fileName);
            }
        } catch (MalformedURLException ex) {
            throw new RuntimeException("File not found " + fileName, ex);
        }
    }
}
2. index.html
<!DOCTYPE html>
<html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="UTF-8">
    <title>图片上传</title>
  </head>
  <body>
    <h2>图片上传</h2>
    <form action="/upload" method="post" enctype="multipart/form-data">
      <!-- 文件上传表单 -->
      <input type="file" name="file" accept="image/*">
      <button type="submit">Upload</button>
    </form>

    <br>

    <!-- 上传成功消息 -->
    <div th:if="${message}" th:text="${message}" style="color: green;"></div>
    <h3>图片链接地址:</h3>
    <h4 th:text="${fileUrl}"></h4>
    <!-- 图片预览 -->
    <div th:if="${fileUrl}">
      <img th:src="${fileUrl}" alt="Uploaded Image" style="max-width: 300px;">
    </div>
  </body>
</html>
3. application.yml
upload:
  path: upload/  # 文件上传路径配置

如何使用

  1. 启动应用程序。
  2. 访问应用程序的根路径(通常是http://localhost:8080/)。
  3. 在页面上选择要上传的图片文件并点击"Upload"按钮。
  4. 等待上传完成,页面将显示上传成功的消息和图片链接。
  5. 可以点击图片链接查看上传的图片。

注意事项

  • 上传的文件将保存在指定的上传路径中,请确保该路径的权限设置正确。
  • 本示例中仅支持图片文件上传,其他类型的文件可能无法正常预览或下载。
  • 请根据实际需求修改上传路径和其他配置参数。

结论

该文档详细介绍了一个基于Spring Boot的简单文件上传功能的实现方式,提供了代码解析和使用说明,希望能够帮助您理解和使用该功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/610049.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超越机械抓手:看多指机器人如何灵活运用触觉?

论文标题&#xff1a; Learning Visuotactile Skills with Two Multifingered Hands 论文作者&#xff1a; Toru Lin, Yu Zhang, Qiyang Li, Haozhi Qi, Brent Yi, Sergey Levine, and Jitendra Malik 1. 机器人新挑战&#xff1a;多指手指操作 在自动化和智能化日益普及的…

winform图书管理系统

winform图书管理系统说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 图书管理员 读者管理 图书管理 添加 修改 删除 查看 入库 书册列表 书册管理用户管理退出 借书 还书 系统管理员 修改图书管理权限 项目获取&#xff1a;…

java对象互换工具类

1:将Object类型转成json字符串 /*** 将对象转为字符串* param obj* return*/public static String toString(Object obj) {if(obj null) {return null;}if ("".equals(obj.toString())) {return null;}if (obj instanceof String) {return obj.toString();}try {Ob…

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是&#xff1a;main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段&#xff0c;getShell&am…

vscode远程免密ssh原理与实操方法

什么是SSH SSH是一种加密协议&#xff0c;全称为Secure Shell&#xff0c;用于安全地远程登录到服务器或其他远程设备上执行命令或传输文件。它提供了一种安全的加密通信机制&#xff0c;使得远程登录和文件传输等操作不会被恶意攻击者窃取或篡改&#xff0c;确保了数据的保密…

全球10KM土地利用程度数据

全球10KM土地利用程度数据 数据介绍 “一带一路”监测区域土地利用程度指数平均值为0.34&#xff0c;不同区域利用程度差异明显&#xff0c;但总体上高值区域与人口分布的稠密区域吻合。中南半岛、南亚、欧洲和小亚细亚半岛等地海拔较低&#xff0c;水热组合条件较好&#xff…

SqlServer数据库导出表结构和数据为脚本文档

需求&#xff1a;把数据库里的数据结构及数据存为脚本&#xff0c;下次一键执行数据库 操作方法&#xff1a; 一、右击该数据库&#xff0c;选择任务 二、下一步 三、如果导出整个数据库就默认&#xff0c;若导出指定的表和视图就选择具体的数据库对象 四、选择另存为脚本文件…

分解质因数-第12届蓝桥杯国赛Python真题解析

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第61讲。 分解质因数&#…

亚信安慧AntDB:解锁数智化的新时代

亚信安慧AntDB的融合实时的特性使得它在数据库领域独树一帜。传统的数据库系统往往只能追求数据的准确性和一致性&#xff0c;但在实际的业务场景中&#xff0c;这些特性并不能满足企业的需求。AntDB的出现打破了传统束缚&#xff0c;为企业带来了全新的数据处理方式&#xff0…

测试用例设计方法-状态迁移图法

一、介绍&#xff1a; 在软件测试领域中&#xff0c;状态迁移图法是一种极为重要且有效的测试方法。状态迁移图法侧重于分析和测试系统中存在的各种状态以及它们之间的迁移关系。所谓状态&#xff0c;就是系统在特定条件下所处的情况或模式&#xff0c;而迁移则是状态之间的转换…

抖音又出王炸级APP,免费的AI写真神器,一键生成不同场景的写真大片(附保姆级教程)

以前想要拍出一组写真大片&#xff0c;是不是还得跑摄像馆&#xff0c;化妆、换装、各种摆 pose、场景布置&#xff0c;少说也要折腾一上午&#xff0c;而且花费还不少。 而现在&#xff0c;有了 AI&#xff0c;在家里&#xff0c;一个人&#xff0c;一部手机&#xff0c;就能…

微同城小程序源码 轻松制作本地生活活动赚钱 带完整的安装代码包以及搭建教程

近年来&#xff0c;本地生活服务市场蓬勃发展&#xff0c;人们对于周边的生活信息、活动资讯等需求日益增长。然而&#xff0c;传统的信息发布方式存在诸多不便&#xff0c;如信息更新不及时、传播范围有限等。微同城小程序源码应运而生。它利用小程序的便捷性和普及性&#xf…

9.为什么有时候会“烫烫烫”——之函数栈桢

目录 1. 什么是函数栈帧 2. 理解函数栈帧能解决什么问题呢&#xff1f; 3. 函数栈帧的创建和销毁解析 3.1 什么是栈&#xff1f; 3.2 认识相关寄存器和汇编指令 3.3 解析函数栈帧的创建和销毁 小知识&#xff1a;烫烫烫~ Q&A 1. 什么是函数栈帧 我们在写C语言代码…

“设置display:block-inline的li或div中添加文字后,导致li或div排版掉落、错位”的原因及解决方法

先说我想实现的效果 然后我就很快的列出来了css .f_wornning{background: url("/assets/images/icon_kaung.png")no-repeat 100% 100%;background-size: 100% 100%;margin: 10px 20px;height: 3rem;line-height: 3rem;color: #d8eebd;.f_wornning_icon{height: 2rem;…

DDoS攻防,本质上是成本博弈!

在互联网里&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击作为一种常见的网络威胁&#xff0c;持续对网站、在线服务和企业基础设施构成严重挑战。本文旨在探讨实施DDoS攻击的大致成本、以及企业如何采取有效措施来防范此类攻击&#xff0c;确保业务连续性和网络…

【图像增强(空域)】基于直方图增强的图像增强及Matlab仿真

1. 摘要 图像的灰度直方图表示灰度图像中具有每种灰度像素的个数&#xff0c;反映了图像中每种灰度级出现的频率&#xff0c;是图像的基本统计特征之一。直方图均衡方法因为其有效性和简单性已成为图像对比度增强的最常用的方法。其基本思想是根据输入图像的灰度概率分布来确定…

Verilog复习(三)| Verilog语言基础

四种基本的逻辑值 0&#xff1a;逻辑0或“假”1&#xff1a;逻辑1或“真”x&#xff1a;未知z&#xff1a;高阻 三类常量 整型数&#xff1a;简单的十进制格式&#xff0c;基数格式&#xff08;5’O37&#xff0c;4’B1x_01&#xff09; 格式&#xff1a; <size><’b…

微搭低代码入门05文件的上传和下载

目录 1 创建数据源2 创建应用3 创建页面4 设置导航功能5 文件上传6 文件下载总结 小程序中&#xff0c;我们通常会有文件的上传和下载的需&#xff0c;在微搭中&#xff0c;文件是存放在云存储中&#xff0c;每一个文件都会有一个唯一的fileid&#xff0c;我们本篇就介绍如何通…

docker-compose管理jenkins

1.安装docker和compose 1.docker 更新系统&#xff1a;yum update 安装依赖项&#xff1a;yum install -y yum-utils device-mapper-persistent-data lvm2 配置镜像源&#xff1a;yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce…

js api part5

学生信息管理系统 现在着急没看..........5.15后一定看 没css&#xff1f;c <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scal…