开发|Springboot文件上传与下载

简介: 开发|Springboot文件上传与下载

问题描述

我们在做项目的时候很多时候会涉及到操作文件的步骤,今天我们就来讲讲如何实现Springboot文件上传与下载。

解决方案

话不多说,我们直接上代码。

首先是添加依赖:

```
<dependency>
   <groupId>commons-fileupload</groupId>
   <artifactId>commons-fileupload</artifactId>
   <version>1.3.1</version>
</dependency>
```

application.properties文件里添加如下内容:

```
spring.servlet.multipart.file-size-threshold=0B
#文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。默认值为0
spring.servlet.multipart.max-request-size=100MB  
#设置上传文件总大小为100MB
spring.servlet.multipart.max-file-size=100MB
```

然后是文件上传的代码:

### 下面是文件上传Controller的代码

@Controller
@RequestMapping("/")
public class FileController {
    //         定义文件存放的父文件夹路径
    private static String parentPath =  "D:"+File.separator+"fileUpload";


    @RequestMapping("/upload")
    public String upload(){
        return "upload";
    }
    @RequestMapping(value = "/upload",method =  RequestMethod.POST)
    @ResponseBody
    public String upload(@RequestParam("file")  MultipartFile file){
//        判断上传文件是否为空,若为空则返回错误信息
        if(file.isEmpty()){
            return  "上传失败";
        }else{
//         获取文件原名
         String originalFilename  = file.getOriginalFilename();
            System.out.println(originalFilename);
//         获取源文件前缀
         String fileNamePrefix =  originalFilename.substring(0,originalFilename.lastIndexOf("."));
         //获取源文件后缀
         String fileNameSuffix =  originalFilename.substring(originalFilename.lastIndexOf("."));
//         将源文件前缀之后加上时间戳避免重名
         String  newFileNamePrefix = fileNamePrefix+new Date().getTime();
//         得到上传后新文件的文件名
         String newFileName =  newFileNamePrefix+fileNameSuffix;
//         创建一个新的File对象用于存放上传的文件
            File  fileNew = new File(parentPath+File.separator+newFileName);
            try {
                file.transferTo(fileNew);
            }  catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "上传成功";
    }
}
```

###以及文件上传的html代码

```html
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-type"  content="text/html; charset=UTF-8">
    <meta http-equiv="X-UA-Compatible"  content="IE=edge,chrome=1"/>
    <title>单文件上传</title>
</head>
<body>
<form method="post" action="/upload"  enctype="multipart/form-data">
    <input type="file"  name="file">
    <input type="submit" value="提交">
</form>
</body>
</html>

```

最后是文件下载的代码:

###如下是文件下载的Controller代码
当然filename在实际的使用中不会被写死,但是在这里演示就直接写死吧
```java
 @RequestMapping(value = "/download",method =  RequestMethod.GET)
    public void download(HttpServletResponse response){
//        通过response输出流将文件传递到浏览器
//        1、获取文件路径
        String fileName = "文件";
//2.构建一个文件通过Paths工具类获取一个Path对象
        Path path =  Paths.get(parentPath,fileName);
        //判断文件是否存在
        if (Files.exists(path)){
            //存在则下载
            //通过response设定他的响应类型
            //4.获取文件的后缀名
            String  fileSuffix = fileName.substring(fileName.lastIndexOf(".")+1);
//            5.设置contentType ,只有指定contentType才能下载
            response.setContentType("application/"+fileSuffix);
//            6.添加http头信息
//            因为fileName的编码格式是UTF-8 但是http头信息只识别 ISO8859-1 的编码格式
//            因此要对fileName重新编码
            try {
                response.addHeader("Content-Disposition","attachment;filename="+new  String(fileName.getBytes("UTF-8"),"ISO8859-1"));
            }  catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
//            7.使用  Path response输出流将文件输出到浏览器
            try {
                Files.copy(path,response.getOutputStream());
            }  catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
```

我们的目的就达成啦!

结语

具体代码的意思到在代码中给了注解的哦,希望能够帮助到你们哦。

目录
打赏
0
0
0
0
14
分享
相关文章
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
74 0
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
48 6
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
本文介绍了 Spring Boot 的核心概念和使用场景,并通过一个实战项目演示了如何构建一个简单的 RESTful API。
47 5
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
67 2
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
168 13
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
161 1
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
63 2
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
240 8
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
81 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
38 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等