news 2026/8/22 14:35:03

一个注解实现下载接口:concept-download @Download注解入门教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个注解实现下载接口:concept-download @Download注解入门教程

一个注解实现下载接口:concept-download @Download注解入门教程

【免费下载链接】concept封装了一些常用组件,走过路过不要错过哦项目地址: https://gitcode.com/gh_mirrors/con/concept

concept-download 是开源项目 concept 中封装的 Spring Boot 下载组件:一个 @Download 注解就能实现文件下载接口,自动完成文件读取、ZIP/TAR 压缩、缓存加速与响应写出,还支持 Servlet 与 Reactive 双栈。本教程面向新手,带你快速掌握 @Download 注解的核心用法。

为什么需要一个下载组件?🤔

传统 Spring 下载接口通常要自己处理一套重复劳动:

  • 判断数据是本地文件、classpath 资源还是远程 URL
  • 打开流、写出响应、设置Content-Disposition
  • 多个文件要手动打 ZIP 包、单文件判断要不要压缩
  • 下载进度日志、异常处理、缓存

concept-download 把这些工作收进了一条「处理链」,你只需要在 Controller 方法上加一个@Download 下载注解,框架自动接管整个流程。

@Download 注解工作原理一览

组件内部由 4 个环节构成:构建参数 → 创建上下文 → 执行处理链 → 善后。

核心组件速览:

组件职责
DownloadOptions汇总注解 + 全局配置的下载参数
CreateSourceHandler把返回值/注解配置解析成统一数据源 Source
LoadSourceHandler并发加载网络资源,支持自定义线程池/协程
CompressSourceHandler自动压缩(ZIP/TAR),支持密码
WriteResponseHandler写出响应,兼容 Servlet 与 Reactive
DownloadEvent全流程事件,可监听进度(兼容 Spring 事件)

注解源码见 Download.java,官方示例代码在 ConceptDownloadController.java。

快速上手:5 种数据源写法

在任意 Controller 方法上加 @Download 即可。下载数据有两种指定方式:写在注解的 source 属性,或作为方法返回值

// 1. 本地文件(source 直接写路径,方法体为空) @Download(source = "file:/Users/Shared/README.txt") @GetMapping("/s1") public void s1() {} // 2. 方法返回文件路径字符串 @Download @GetMapping("/s2") public String s2() { return "file:/Users/Shared/README.txt"; } // 3. 方法直接返回 File / ClassPathResource 对象 @Download @GetMapping("/s3") public File s3() { return new File("/Users/Shared/README.txt"); } // 4. 任意文本直接当文本文件下载 @Download(filename = "s9.txt") @GetMapping("/s9") public String s9() { return "任意文本将会直接作为文本文件处理"; }

支持的路径前缀包括file:(本地)、user.home:(用户目录)、classpath:(资源文件)、http(s)://(远程 URL),返回值还兼容List、POJO 集合等多种形态。

下载多个文件:自动打包成压缩包

当有多个数据源时,组件会自动压缩(默认 ZIP)后下发,单个文件默认不压缩,可用forceCompress强制开启:

@Download(source = { "classpath:/download/text.txt", "http://192.168.20.112:8088/demo/download"}, filename = "压缩包14.zip") @GetMapping("/s14") public void s14() {}

在线预览:图片/视频直接展示

设置inline = true并指定contentType,浏览器就不再触发下载而是直接预览:

@Download(source = "classpath:/download/image.jpg", inline = true, contentType = "image/jpeg") @GetMapping("/image.jpg") public void image() {}

@Download 注解属性速查表

属性说明
source下载数据(路径/URL 数组),优先级最高
filename浏览器中显示的下载文件名
inline是否内联预览(图片、视频等)
contentType响应头 Content-Type
compressFormat压缩格式:zip(默认)/ tar / tar.gz
compressPassword压缩密码(支持 SpEL 如${download.password}
forceCompress单文件是否强制压缩
charset指定编码时以字符流读取(如 GBK)
headers额外响应头,两两一组 name/value

缓存加速:@SourceCache 与 @CompressCache 🚀

远程资源反复下载会拖慢接口?配合两个缓存注解(源码见 SourceCache.java):

  • @SourceCache:把网络数据缓存到本地磁盘,下次直接读取
  • @CompressCache:把压缩结果也缓存下来,内容不变就不重复压缩
@Download(filename = "压缩包16.zip") @SourceCache(group = "s16", delete = true) @CompressCache(group = "s16", name = "s16.zip", delete = true) @GetMapping("/s16") public List<Object> s16() { ... }

group用于按业务划分缓存子目录,delete = true表示下载结束后清理缓存,适合内容动态变化的场景。

全局配置:concept.download 前缀

大部分默认值可以在配置文件中统一调整(绑定类见 DownloadProperties.java):

concept: download: compress: format: zip # 默认压缩格式 password: 123456 # 默认压缩密码 cache: enabled: true # 开启压缩缓存 delete: false source: cache: enabled: true # 开启数据源缓存

注解上的配置优先级高于全局配置,需要时也可以让方法返回DownloadOptions.Configurer在回调中动态修改本次下载的全部参数。

总结与延伸阅读

  • 一个 @Download 注解 = 读取 + 压缩 + 缓存 + 写出,覆盖 Servlet / Reactive
  • 多文件自动打 ZIP/TAR,支持密码与在线预览
  • 通过 @SourceCache、@CompressCache 二级缓存显著降低重复下载成本

更多场景(异步消费、自定义事件监听、POJO 数据源)可参考完整示例 ConceptDownloadController2.java,以及模块的自动配置入口 DownloadConceptCoreAutoConfiguration.java。

【免费下载链接】concept封装了一些常用组件,走过路过不要错过哦项目地址: https://gitcode.com/gh_mirrors/con/concept

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 14:31:19

5分钟部署Venice集群:Docker单机数据中心快速上手教程

5分钟部署Venice集群&#xff1a;Docker单机数据中心快速上手教程 【免费下载链接】venice Venice, Derived Data Platform for Planet-Scale Workloads. 项目地址: https://gitcode.com/gh_mirrors/venic/venice Venice 是 LinkedIn 开源的派生数据平台&#xff08;Der…

作者头像 李华