【springboot】实现文件上传和下载

news2025/1/4 17:21:02

目录

  • 1. 新建一个springboot项目
  • 2. 配置文件
    • application.properties
    • application.yml
  • 3. 控制类实现文件上传和下载
  • 4. 测试

1. 新建一个springboot项目

      新建一个springboot项目,选择web,默认即可.

      主要pom配置文件如下:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--web包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
<!--    maven打包设置-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

2. 配置文件

      在配置文件中配置文件上传和下载的根目录,文件大小限制等。

application.properties

file.upload.url=path/to/upload
# 文件大小限制
spring.servlet.multipart.max-file-size=10MB 
# 请求大小限制
spring.servlet.multipart.max-request-size=20MB

application.yml

file.upload.url: path/to/upload
spring:
  servlet:
    multipart:
      # 文件大小限制
      max-file-size: 10MB
      
      max-request-size: 20MB

3. 控制类实现文件上传和下载

      在控制类中实现文件上传和下载。其中,文件上传通过MultipartFile实现文件类型限制、文件大小限制、多文件上传等,下载通过文件流实现。

@RestController
@RequestMapping(value = "/file")
@CrossOrigin // 允许跨域
@ControllerAdvice // 全局异常处理
public class FileController {

    //上传的根目录
    @Value("${file.upload.url}")
    private String uploadFilePath;
    @Value("${file.upload.url}")
    private String downloadFilePath;

    //捕获上传文件过大的异常
    //@ExceptionHandler标识方法将处理指定类型的异常
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<String> handleMaxSizeException(MaxUploadSizeExceededException exc) {
        return ResponseEntity.status(HttpStatus.PAYLOAD_TOO_LARGE).body("文件过大,请重新选择上传图片!");
    }
    
    @RequestMapping("/upload")
    public String httpUpload(
            @RequestParam("files")
                     //MultipartFile 是 Spring 框架中用于处理文件上传的接口
                     MultipartFile files[]) {
        StringBuffer urls = new StringBuffer();
        //遍历多个文件
        for (int i = 0; i < files.length; i++) {
            //获取文件类型
            String contentType = files[i].getContentType();
            System.out.println(contentType);
            if (!contentType.contains("image")) {
                return "文件格式不正确,请重新选择图片!";
            }
            //获取上传文件的后缀名
            String postfix = files[i].getOriginalFilename().substring(files[i].getOriginalFilename().lastIndexOf("."));
            //生成文件名 使用时间戳,避免重名
            String fileName = System.currentTimeMillis()+postfix;
            System.out.println(fileName);
//            File dest = new File(uploadFilePath + '/' + fileName);
            File dest = new File(uploadFilePath + '/' + fileName);
            //目录不存在则创建目录
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();
            }
            try {
                //将上传的文件保存到指定的目标位置
                files[i].transferTo(dest);
            } catch (Exception e) {
                return "程序错误,请重新上传\n" + e.toString();
            }
            urls.append("\n"+uploadFilePath + '\\' + fileName);
        }
        return "文件上传成功" + urls.toString();
    }

    @RequestMapping("/download")
    public String fileDownLoad(HttpServletResponse response, @RequestParam("fileName") String fileName) {
//        File file = new File(downloadFilePath + '/' + fileName);
        File file = new File(downloadFilePath + '\\' + fileName);
        if (!file.exists()) {
            return "下载文件不存在";
        }
        //清除之前设置的内容
        response.reset();
        //设置响应内容类型为二进制流
        response.setContentType("application/octet-stream");
        //设置响应字符编码为UTF-8
        response.setCharacterEncoding("utf-8");
        //设置响应文件大小
        response.setContentLength((int) file.length());
        //设置浏览器以附件的形式下载,并设置文件名
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));) {
            byte[] buff = new byte[1024];
            OutputStream os = response.getOutputStream();
            int i = 0;
            while ((i = bis.read(buff)) != -1) {
                os.write(buff, 0, i);
                os.flush();
            }
        } catch (IOException e) {
            return "下载失败";
        }
        return "下载成功";
    }
}

4. 测试

      以下测试使用工具postman实现。测试文件大小的图片可以使用代码生成,可参考文章。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述


参考链接:

https://cloud.tencent.com/developer/article/1594124

https://cloud.baidu.com/article/2773207

https://blog.csdn.net/m0_63297090?type=blog

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

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

相关文章

Ubuntu2404使用docker安装Oracle23_ai_Free

Oracle 安装docker安装部署 官网&#xff1a;Oracle23AI 功能亮点 AI战略搜索 Oracle AI Vector Search专为人工智能&#xff08;AI&#xff09;工作负载而设计&#xff0c;允许您基于语义而不是关键字查询数据。 JSON 关系二元性 数据可以作为 JSON 文档或关系表透明地访问和…

十大排序之:冒泡排序

目录 一、简介 实现过程 时间复杂度 二、代码实现 函数声明 Swap函数 单趟 多趟 测试 优化 一、简介 冒泡排序是一种简单的排序算法&#xff0c;它重复地比较相邻的两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有元素需要交换为止。这个过程类…

Python | Leetcode Python题解之第414题第三大的数

题目&#xff1a; 题解&#xff1a; class Solution:def thirdMax(self, nums: List[int]) -> int:a, b, c None, None, Nonefor num in nums:if a is None or num > a:a, b, c num, a, belif a > num and (b is None or num > b):b, c num, belif b is not No…

Cpp快速入门语法(下)(2)

文章目录 前言一、函数重载概念与使用C为何支持函数重载&#xff1f; 二、引用概念语法特性权限(常引用)使用场景与指针的区别 三、内联函数四、auto关键字(C11)五、基于范围的for循环(C11)六、指针空值nullptr(C11)总结 前言 承前启后&#xff0c;正文开始&#xff01; 一、函…

C++ | Leetcode C++题解之第414题第三大的数

题目&#xff1a; 题解&#xff1a; class Solution { public:int thirdMax(vector<int> &nums) {int *a nullptr, *b nullptr, *c nullptr;for (int &num : nums) {if (a nullptr || num > *a) {c b;b a;a &num;} else if (*a > num &&am…

一般在写SQL时需要注意哪些问题,可以提高查询的效率?

很多人写SQL按照自己喜好&#xff0c;没有规则意识&#xff0c;这对于自主查询影响不大&#xff0c;你爱怎么搞就怎么搞&#xff0c;一旦涉及到提交任务或团队共享&#xff0c;就不能乱写了&#xff0c;会浪费资源影响到开发效率&#xff0c;严重的甚至会服务器瘫痪。 提几个关…

深度学习之图像数据集增强(Data Augmentation)

文章目录 一、 数据增强概述二、python实现传统数据增强参考文献 一、 数据增强概述 数据增强&#xff08;Data Augmentation&#xff09;是一种技术&#xff0c;通过对现有数据进行各种变换和处理来生成新的训练样本&#xff0c;从而增加数据集的多样性和数量。这些变换可以是…

dubbo三

dubbo dubbo架构各层说明 URL举例解析 消费者引用服务过程 项目初始化

世界排名第一的数码照片和图形放大软件PhotoZoom Pro 9

BenVista PhotoZoom Pro 9 是世界排名第一的数码照片和图形放大和缩小软件解决方案。 PhotoZoom Pro 9 配备了我们全新的 S-Spline Max AI 图像调整大小技术&#xff0c;可产生比以往任何时候都更高质量的图像放大。 您所要做的就是指定您想要的图像大小&#xff0c;它实际上是…

【3D打印】使用simplify 3D切片更改Gcode手动断电续打、掉电、未打完继续打印、补救

一、问题描述 有些时候会遇到3D打印机没料但机器还在继续打、掉电重启后未正常恢复打印、挤出机端没有料但断料检测未触发等情况。我们又不想打印放弃&#xff0c;但又想继续之前的进度打印。 这时候我们需要更改3D打印文件的Gcode参数来进行继续打印。 至于什么是Gcode&…

电磁阀,线性电磁阀信号驱动隔离变送器

电磁阀,线性电磁阀信号驱动隔离变送器 定义:用模拟信号控制电磁阀门开关驱动的信号隔离产品,广泛用于流量控制,加料控制. 电磁阀开驱动隔离变送器为一进一出系列,型号是:JSD TAP-1001系列 该电磁阀驱动设备具有以下特点:特征&#xff1a; ◆低成本,PA66阻燃外壳,国际标准DIN35导…

程序设计题(41-48)

第四十一题 题目 #include <stdio.h> #include <math.h> double fun(double x , int n) {}main() { void NONO ();printf("%f\n", fun(0.3,10));NONO();getchar(); }void NONO () {/* 本函数用于打开文件&#xff0c;输入数据&#xff0c;调用函数&am…

防火墙——NAT

目录 NAT NAT分类 旧分类 新分类 NAT配置 源NAT​编辑 配置源NAT地址池​编辑 关于源NAT环路问题 环境如下​编辑 防火墙nat​编辑​编辑 路由器要配置指向11.0.0.0 网段的静态路由​编辑 测试​编辑 如果此时有外网用户直接pingNAT地址&#xff0c;则环路出现。​…

【手撕算法】快速排序(递归分治法)Python实现

一、算法 class Solution:def Partition(self, nums, low, high):pivotkey nums[low] # 元素copied, nums[low]空了出来while low < high:while low < high and nums[high] > pivotkey:high high - 1 # 直到找到一个nums[high]<pivotkey位置nums[low] nums[h…

【C语言】联合体枚举的讲解

目录 ✨声明&#xff01;&#xff01;&#xff01;&#xff1a; 联合体与结构体只有一个区别&#xff0c;那就是内存存储方式不同 &#x1f495;1.联合体的声明 &#x1f495;2.联合体内存的存储 &#x1f495;3.联合体字节大小的计算 例题2&#xff1a; ✨4.枚举的声明…

2024最新股票系统源码 附教程

1.环境 环境 php7.4 sql 5.7 Nginx1.2 tomcat-8 redis 放行1-65535 2.创建5个网站。xxx.com替换你的域名 ftp.xxx.com api.xxx.com agent.xxx.com admin.xxx.com wap.xxx.com api设置反向代理 代理名称 api 目标URL http://127.0.0.1:8091 新建ftp 目录指向新建的…

绝缘子缺陷检测数据集

绝缘子缺陷检测数据集&#xff0c;2800张高清照片&#xff0c;已打好标签txt格式&#xff0c;可直接进行目标检测。7类标签&#xff1a;玻璃绝缘子&#xff0c;玻璃片脏污&#xff0c;玻璃片缺损&#xff0c;聚合物片脏污&#xff0c;聚合物片缺损&#xff0c;聚合物绝缘子&…

K8S - Access Control 机制介绍

作为开发人员&#xff0c; 我们通常会直接用root 帐号操作 k8s master node 里的kubectl 命令&#xff0c;并不能感知k8s 多用户权限管理存在。 即使自动化&#xff0c; 我们也会考虑用ansible 来远程操作master node… 所以大部分开发人员默认上是不用深入研究k8s的Access c…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

[数据结构]算法复杂度详解

文章目录 一、引言1、想象数据结构与算法的奇妙世界2、算法复杂度的轻松解读3、数据结构与算法的温馨寄语 二、轻松掌握复杂度基础1、时间复杂度&#xff1a;算法速度的衡量尺2、空间复杂度&#xff1a;算法占地的衡量尺3、常见的复杂度 三、复杂度的计算1、时间复杂度计算2、空…