SpringBoot 项目中实现文件下载功能_springboot创建多模块代码下载-程序员宅基地

技术标签: spring  spring boot  java  http  后端  SpringBoot常用操作  

springboot 项目中,可能会存在让用户下载文档的需求,比如让用户下载 readme、模板等 文档来更好地了解该项目的概况或使用方法。 所以,您需要为用户提供可以下载文件的 API ,将用户希望获取的文件作为下载资源返回给前端用户。

1.创建好一个 springboot 项目,一定要引入 web 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.在application.yml 中,进行如下属性配置:

file:
  doc-dir: doc/

该路径就是待下载文件存放在服务器上的目录,为相对路径,表示与当前项目(jar包)的相对位置。

3.springboot 中的注解 @ConfigurationProperties 可以将 application 中定义的属性与 pojo 类自动绑定。所以,我们需要定义一个 pojo 类来做 application 中 file.doc-dir=doc/ 的配置绑定:

@ConfigurationProperties(prefix = "file")
@Data
public class FileProperties {
    
    private String docDir;
}

注解 @ConfigurationProperties(prefix = “file”) 在 springboot 应用启动时将 file 为前缀的属性与 pojo 类绑定,也就是将 application.yml 中的 file.doc-dir 与 FileProperties 中的字段 docDir 做了绑定。

4.在启动类或其他配置类(@Configuration注解标记)上加入 @EnableConfigurationProperties 即可让 ConfigurationProperties 特性生效。

@SpringBootApplication
@EnableConfigurationProperties({
    FileProperties.class})
public class AutoTestApplication {
    

    public static void main(String[] args) {
    
        SpringApplication.run(AutoTestApplication.class, args);
    }

}

5.在控制层我们将以 spring 框架的 ResponseEntity 类作为返回值传给前端,其中泛型为 spring io 包的 Resource 类,这意味着返回内容为 io 流资源;并在返回体头部添加附件,以便于前端页面下载文件。

@RestController
@RequestMapping("file")
public class FileController {
    

    private static final Logger logger = LoggerFactory.getLogger(FileController.class);

    @Autowired
    private FileService fileService;

    @GetMapping("download/{fileName}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName,
                                                 HttpServletRequest request) {
    
        Resource resource = fileService.loadFileAsResource(fileName);
        String contentType = null;
        try {
    
            contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
        } catch (IOException e) {
    
            logger.error("无法获取文件类型", e);
        }
        if (contentType == null) {
    
            contentType = "application/octet-stream";
        }

        return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType(contentType))
                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"")
                .body(resource);
    }
}

6.服务层的主要工作是把文件作为 IO 资源加载。注意,在 Service 实现类的构造方法中要使用 @Autowired 注入前面定义好的属性绑定类 FileProperties.

@Service
public class FileServiceImpl implements FileService {
    

    private final Path filePath;

    @Autowired
    public FileServiceImpl(FileProperties fileProperties) {
    
        filePath = Paths.get(fileProperties.getDocDir()).toAbsolutePath().normalize();
    }

    @Override
    public Resource loadFileAsResource(String fileName) {
    
        Path path = filePath.resolve(fileName).normalize();
        try {
    
            UrlResource resource = new UrlResource(path.toUri());
            if (resource.exists()) {
    
                return resource;
            }
            throw new FileException("file " + fileName + " not found");
        } catch (MalformedURLException e) {
    
            throw new FileException("file " + fileName + " not found", e);
        }
    }
}

7.自定义异常
在服务层,我们抛出自定义的文件异常 FileException.

public class FileException extends RuntimeException {
    

    public FileException(String message) {
    
        super(message);
    }

    public FileException(String message, Throwable cause) {
    
        super(message, cause);
    }
}

8.前端
在前端 html 页面,可以使用 a 标签来下载文件,注意在 a 标签中定义 download 属性来规定这是一个下载文件。

<a href="/file/download/readme.pdf" download>下载使用手册</a>

如果对你有帮助,请一定要帮忙点赞好评,给予创作的动力…

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yukuleshui/article/details/112859437

智能推荐

企业邮箱在Outlook office 2010上POP3/IMAP的设置方法_修改公司outlook收件方式-程序员宅基地

文章浏览阅读2.8k次。如您在“添加新账户“页面中选择的为IMAP协议:则接收服务器imap端口号为:143或993,发送服务器smtp端口号为:25或465。第6步:“其他设置”-“发送服务器”,勾选“我的发送服务器(SMTP)要求验证”和“使用与接收邮件服务器相同的设置”。发送邮件服务器:smtp.mxhichina.com或smtp.qiye.aliyun.com或者smtp.您的域名。发送邮件服务器:smtp.mxhichina.com或smtp.qiye.aliyun.com或者smtp.您的域名。_修改公司outlook收件方式

k8s学习笔记5-部署和应用ingress-nginx-controller(v1.3.0)-程序员宅基地

文章浏览阅读4.9k次,点赞6次,收藏21次。Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。_ingress-nginx-controller

什么是 Canny 边缘检测算法?-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏41次。点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达一、简介Canny 边缘检测器是一种多步算法,用于检测任何输入图像的边缘。它涉及在检测图像边缘时要..._canny边缘检测算法

Linux系统中的Page cache和Buffer cache,kafka面试避免重复消费-程序员宅基地

文章浏览阅读701次,点赞7次,收藏6次。上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。很多人担心学了容易忘,这里教你一个方法,那就是重复学习。打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

下载并安装Anaconda_anaconda3-4.2.0-windows-x86_64.exe-程序员宅基地

文章浏览阅读1.3k次。下载并安装Anaconda目录1、下载2、安装Anaconda3-4.2.0-Windows-x86_64.exe3、测试是否安装成功4、注意事项5、问题总结1、下载Anaconda3-4.2.0-Windows-x86_64.exe官网下载链接:https://www.anaconda.com/download/下载链接:https://mirrors.t..._anaconda3-4.2.0-windows-x86_64.exe

numpy tofile() 生成bin文件 float32转为int8_numpy 保存为 bin 文件-程序员宅基地

文章浏览阅读1.1k次。昇腾AI适配_numpy 保存为 bin 文件

随便推点

【MPC5744P】FreeMaster上位机配置_freemaster2.0安装-程序员宅基地

文章浏览阅读6.5k次,点赞5次,收藏55次。FreeMaster调试相对于劳特巴赫的工具可能没有那么强大,但是它有一个优点,就是免费,也可以实时观察变量,而无需停下来,不过需要注意的是变量必须是全局变量。FreeMaster本质上和普通上位机没有太多区别(比一般上位机多了调试口连接),但是对于一般调试而言,可以大大减少开发者自行开发上位机的必要性。FreeMaster上位机可以直接加在elf文件并且获取其中的符号对应的地址,因此动态..._freemaster2.0安装

EEGnet复现记录_eegnet self.drop_out = 0.25 self.block_1 = nn.sequ-程序员宅基地

文章浏览阅读115次。EEGnet复现_eegnet self.drop_out = 0.25 self.block_1 = nn.sequential( # nn.zeropad2d((46

一个 Yii + vue 项目(3) 解决跨域、数据库配置_vue与yii前后端-程序员宅基地

文章浏览阅读2.4k次。ok,有了基础的环境,就可以写功能了,首先要实现的功能就是 登陆验证,这个时候我们还需要建一个数据库,我在本地建了个数据库,添加了一个简单的表 user: user 表的 name 字段是用来存储用户的名字的,而 username 和 password 则是对应的账号密码,考虑到大多数人反感填太多注册信息,只留了个手机号的字段,为之后可能存在的逻辑做预留。 之前细心的童鞋可能发现我用了两个域_vue与yii前后端

Linux(Debian)之安装Java JDK及注意事项_debian 12 安装jdk11-程序员宅基地

文章浏览阅读491次。转自:http://www.cnblogs.com/hanyinglong/p/5025635.html说明:本人是以Debian 操作系统来进行安装的,这篇文章有很大帮助,才学Linux对有些命令不太熟悉,文章中有的命令我自己没有运行成功:    例如命令:cd usr/local/ mkdir kencery cd kencery/ 执行后没有找到目录         我是这样写的:..._debian 12 安装jdk11

MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487_ms2548 哪里可以买-程序员宅基地

文章浏览阅读322次。MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487_ms2548 哪里可以买

I.MX6 PLL5 clock hakcing-程序员宅基地

文章浏览阅读135次。/************************************************************************** * I.MX6 PLL5 clock hakcing * 说明: * 由于需要调整I.MX6的PLL5工作clock,所以需要了解I.MX6的PLL5 clock设置 * 细节。..._imx6 pll5 时钟

推荐文章

热门文章

相关标签