SpringBoot的图片上传

news2024/10/5 21:22:09

简介

该文档旨在介绍一个基于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的简单文件上传功能的实现方式,提供了代码解析和使用说明,希望能够帮助您理解和使用该功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

孔板流量计和孔板流量计真的不一样

孔板流量计和孔板流量计真的不一样&#xff0c;无论您是追求品质&#xff0c;还是注重实用功能&#xff0c;我们的产品都能让您心动不已。让您轻松享受到现代科技所带来的便利&#xff0c;尽情展现自己不一样的魅力。 用途【1-5-9】 孔板流量计为煤矿瓦斯抽放而设的计算瓦斯抽…

vue3.0(五) reactive全家桶

文章目录 1 reactive1.1 reactive的应用1.2 reactive的特点1.3 reactive的注意1.4 reactive的局限性 2 toRefs3 isReactive4 shallowReactive5 readonly5.1 readonly 详细信息5.2 readonly函数创建一个只读的响应式对象5.3 如何修改嵌套在只读响应式对象中的对象? 6 isReadonl…

SG3225EEN在PAM4光模块和400G,QSFP-DD光模块中的应用

爱普生晶振SG3225EEN&#xff0c;156.25MHz在PAM4光模块和QSFP-DD光模块中的应用。光模块市场已发展至400G光模块&#xff0c;那么PAM4光模块和400G QSFPDD光模块有哪些区别呢?SG3225EEN又是怎么应用在PAM4光模块和QSFP-DD光模块中的呢? 首先介绍的是PAM4光模块:PAM4是PAM(脉…

爱思控AQMDBLS-Ax/Bx/Mx/T 系列无刷电机驱动器使用

履带车配置 AQMDBLS-Ax/Bx/Mx/T 系列无刷电机驱动器使用大致需要以下几个步骤。 1&#xff09; 阅读用户使用说明书、了解驱动器的性能、明确控制目的&#xff1b;2&#xff09; 根据电机和驱动器的接线原理&#xff0c;正确接线&#xff1b;3&#xff09; 使用 485 通讯控制&…

FileLink跨网文件摆渡系统:保障数据安全,促进业务高效协同

FileLink跨网文件摆渡系统&#xff0c;作为一种先进的文件传输解决方案&#xff0c;正逐渐在企业级应用中崭露头角。它打通了不同网络之间的隔阂&#xff0c;使得文件能够安全、高效地从一个网络传输到另一个网络。 FileLink跨网文件摆渡系统基于先进的加密技术和数据传输协议&…

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

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

【Linux网络编程】高级IO——五种IO模型

高级IO 1.什么是IO&#xff1f;什么是高效的IO&#xff1f;2.有那些IO的方式&#xff1f;这么多的方式&#xff0c;有那些是高效的&#xff1f;3.五种IO模型4.高级IO重要概念5.非阻塞IO 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x…

shopro商城 源码搭建/部署/上线/运营/售后/更新

基于Fastadmin和Uniapp进行开发的多平台&#xff08;微信公众号、微信小程序、H5网页、Android-App、IOS-App&#xff09;购物商城&#xff0c;拥有强大的店铺装修、自定义模板、路由同步、多端支付&#xff08;微信&#xff0c;支付宝&#xff09;、多规格商品、运费模板、多地…

突发!31篇文章被撤!这本Springer旗下SCI,开始大面积撤稿,原因涉及同行评议!

【欧亚科睿学术】 近期&#xff0c;期刊JOURNAL OF COMBINATORIAL OPTIMIZATION撤回了31篇文章&#xff0c;大部分文章都是由中国学者参与。主要原因是包括但不限于&#xff1a;编辑处理和同行评议过程的妥协&#xff0c;不恰当或不相关的参考文献&#xff0c;或者不在期刊或客…

如何高效合并Python字典?掌握这些技巧,让你的代码更优雅!

在Python中&#xff0c;字典&#xff08;Dictionary&#xff09;是一种非常有用的数据结构&#xff0c;它允许我们以键值对的形式存储数据。在日常编程中&#xff0c;我们经常需要将两个或多个字典合并为一个。幸运的是&#xff0c;Python提供了一种简洁而高效的方式来实现这一…

探索财富新纪元:订单排队模式引领企业革新之路

尊敬的企业家们&#xff0c;大家好&#xff01;在现今这个竞争激烈的商业环境中&#xff0c;寻找一种既高效又具持续性的商业策略&#xff0c;是每个企业家都关注的焦点。今天&#xff0c;我要为您揭示一种前沿的商业模式——订单排队模式&#xff0c;它可能为您的企业开启全新…

金蝶BI应收分析报表:关于应收,这样分析

这是一张出自奥威-金蝶BI方案的BI应收分析报表&#xff0c;是一张综合运用了筛选、内存计算等智能分析功能以及数据可视化图表打造而成的BI数据可视化分析报表&#xff0c;可以让企业运用决策层快速知道应收账款有多少&#xff1f;账龄如何&#xff1f;周转情况如何&#xff1f…

2024数维杯数学建模A题B题C题思路+模型+代码(开赛后第一时间更新)

2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09; https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024年第九届数维杯大学生数学建模挑战赛参赛规则 竞赛要求及论文提交方式; ①本次参赛作品统一在线提交到竞赛…

echarts-gl 离线3D地图

1、安装依赖 echarts-gl 与 echarts 版本关系&#xff1a; "echarts": "^5.2.0", "echarts-gl": "^2.0.8"# 执行安装 yarn add echarts-gl2、下载离线地图 免费下载实时更新的geoJson数据、行政区划边界数据、区划边界坐标集合_…

2024年北京服贸会媒体邀约资源有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 2024年北京服贸会&#xff08;中国国际服务贸易交易会&#xff0c;简称CIFTIS&#xff09;作为中国重要的国际性服务贸易盛会&#xff0c;会吸引众多媒体的关注和参与。媒体邀约资源通常…

【记录】常见的前端设计系统(Design System)

解释一下设计系统的定义&#xff0c;以及在国内&#xff0c;都有那些优秀的设计系统可以学习&#xff0c;希望可以帮到大家。 什么是设计系统&#xff08;Design System)&#xff1f; 设计系统&#xff08;Design System&#xff09;是一套综合性的指导原则、组件和规则&…

标准参编征集|《第三方运维服务水平评价指南 工业废水处理设施》

目前&#xff0c;对于工业废水处理设施第三方运维服务的标准&#xff0c;国家和行业未曾出台有针对性的评价标准和规范&#xff0c;工业企业和工业园区对第三方运维服务的监督、考核、评价体系需要进一步补充和完善。 本标准的编制旨在帮助第三方运营单位从运营技术和管理举措…

如何使用XCTest进行ios自动化测试?

iOS自动化测试框架有哪些&#xff1f; iOS自动化测试框架有很多&#xff0c;以下是一些常用的iOS自动化测试框架&#xff1a; XCTest&#xff1a; XCTest是苹果官方提供的iOS自动化测试框架&#xff0c;可以用于单元测试和UI测试。 Appium&#xff1a; Appium是一个跨平台的自…

【Linux系统编程】第十四弹---进度条

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、回车和换行 2、观察回车换行现象 3、缓冲区 4、usleep和fflush函数 5、简单倒计时 6、进度条 6.1、版本一 6.2、版本…

【数据结构】单链表专题详细分析

与其临渊羡鱼&#xff0c;不如退而结网。&#x1f493;&#x1f493;&#x1f493; 目录 •✨说在前面 &#x1f34b;知识点一&#xff1a;什么是链表&#xff1f; • &#x1f330;1.链表的概念 • &#x1f330;2.链表的结构 • &#x1f330;3.链表的分类 &#x1f34b;…