精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

太方便了!SpringBoot 只需一個注解,就能搞定任意對象下載!

開發 前端
?在日常開發中,文件下載是一個常見的功能,雖然在項目中出現的頻率可能不算太高,但幾乎每個項目都會涉及。而有些下載需求相對復雜,雖然不是難點,但實現起來卻十分繁瑣。

在日常開發中,文件下載是一個常見的功能,雖然在項目中出現的頻率可能不算太高,但幾乎每個項目都會涉及。而有些下載需求相對復雜,雖然不是難點,但實現起來卻十分繁瑣。

因此,為了簡化這一過程,有一個工具庫,使得下載功能的實現變得更加簡單快捷。

https://github.com/Linyuzai/concept/wiki/Concept-Download

一鍵下載任意對象

如果告訴你,現在僅需一個注解就能輕松下載任意對象,你會不會覺得很方便?

import com.icoderoad.download.annotation.Download;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;


@RestController
public class DownloadController {


    @Download(source = "classpath:/download/README.txt")
    @GetMapping("/classpath")
    public void downloadFromClasspath() {
    }


    @Download
    @GetMapping("/file")
    public File downloadFile() {
        return new File("/Users/Shared/README.txt");
    }


    @Download
    @GetMapping("/http")
    public String downloadFromHttp() {
        return "http://127.0.0.1:8080/icoderoad-download/image.jpg";
    }
}

看起來似乎沒有太大變化?那讓我們看看一個實際場景。

真實業務中的應用

在一個設備管理平臺中,每個設備都會有一個二維碼圖片,其地址存儲在數據庫的一個字段中。現需導出所有設備的二維碼圖片,并以設備名稱命名,最終打包成 ZIP 文件。

實現這一需求,需要:

  1. 查詢設備列表。
  2. 根據二維碼 URL 下載圖片并存入本地緩存。
  3. 處理緩存判斷,避免重復下載。
  4. 并發下載以提升性能。
  5. 下載完成后生成 ZIP 文件。
  6. 將 ZIP 文件寫入響應流。

整個實現過程大約需要 200 行代碼,顯得十分冗長繁瑣。于是我思考是否有更簡單的方法。

其實,我們只需要提供待下載的數據,比如文件路徑、文件對象、文本內容、HTTP 地址,甚至是一個自定義對象,而無需關注下載邏輯。

于是,我們可以這樣簡化實現:

import com.icoderoad.download.annotation.Download;
import com.icoderoad.download.annotation.SourceName;
import com.icoderoad.download.annotation.SourceObject;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;


@RestController
public class DeviceDownloadController {


    private final DeviceService deviceService;


    public DeviceDownloadController(DeviceService deviceService) {
        this.deviceService = deviceService;
    }


    @Download(filename = "二維碼.zip")
    @GetMapping("/download")
    public List<Device> downloadDevices() {
        return deviceService.all();
    }
}


class Device {
    private String name;


    @SourceObject
    private String qrCodeUrl;


    @SourceName
    public String getQrCodeName() {
        return name + ".png";
    }
}

只需標注注解,系統會自動處理文件名稱、下載內容、打包等邏輯,無需手動編寫大量代碼。

設計思路

這一功能的核心思想是基于 AOP 攔截下載請求,并結合 Spring WebFlux 進行異步處理。

@Download 注解說明

參數

說明

source

需要下載的內容,但是優先級低于返回值 如果方法返回值不為null則會使用返回值作為下載的內容

inline

如果為true,可以直接在瀏覽器預覽 需要配合contentType,如圖片或視頻,默認false 視頻文件目前存在一些問題,還在測試階段

filename

指定下載時瀏覽器上顯示的名稱 如果不指定則會獲取下載內容的名稱,如文件則使用文件名

contentType

如果未指定,會嘗試獲取 如果嘗試獲取失敗,則默認application/octet-stream 或application/x-zip-compressed

compressFormat

壓縮格式,默認zip

forceCompress

強制壓縮 如果為true,不管下載的文件有幾個都會壓縮 如果為false,有多個文件時壓縮,只有一個文件時不壓縮 默認false

charset

如果下載包含中文的文本文件出現亂碼,可以嘗試指定編碼

headers

統一的響應頭,每2個為一組

extra

額外的數據,當需要自行編寫額外流程業務時可能會用到

整體流程

圖片圖片

響應式支持

為了兼容 Spring WebFlux,我們需要獲取 ServerHttpResponse,但不能直接使用 RequestContextHolder,因此可以通過 WebFilter 進行注入:

import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;


public class ReactiveDownloadFilter implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        return chain.filter(exchange)
                .contextWrite(ctx -> ctx.put(ServerHttpResponse.class, exchange.getResponse()));
    }
}

然后在需要的地方通過 ReactiveDownloadHolder 獲取響應對象。

import org.springframework.web.server.ServerHttpResponse;
import reactor.core.publisher.Mono;


public class ReactiveDownloadHolder {
    public static Mono<ServerHttpResponse> getResponse() {
        return Mono.deferContextual(ctx -> Mono.just(ctx.get(ServerHttpResponse.class)));
    }
}

處理下載任務

下載任務分為多個步驟,例如:

  1. 獲取文件路徑或 File 對象。
  2. 如果是多個文件,則先進行壓縮處理。
  3. 將最終文件寫入響應流。

因此,我們采用類似 Spring Cloud Gateway 過濾鏈的方式,設計了 DownloadHandler:

import reactor.core.publisher.Mono;

public interface DownloadHandler {
    Mono<Void> handle(DownloadContext context, DownloadHandlerChain chain);
}

每個 DownloadHandler 處理特定任務,如下載、壓縮、寫入響應流等。

適配多種數據源

不同類型的下載對象需要不同的處理方式,例如文件、HTTP 地址、自定義對象等,因此我們抽象出 Source 接口,并通過 SourceFactory 進行匹配。

public interface SourceFactory {
    boolean support(Object source, DownloadContext context);
    Source create(Object source, DownloadContext context);
}

例如:

public class FileSourceFactory implements SourceFactory {
    @Override
    public boolean support(Object source, DownloadContext context) {
        return source instanceof File;
    }


    @Override
    public Source create(Object source, DownloadContext context) {
        return new FileSource((File) source);
    }
}

結語

這個工具庫極大簡化了文件下載功能,尤其是針對復雜的批量下載需求,只需簡單的注解即可完成。如果你正在開發 SpringBoot 3.4 版本的項目,并需要實現高效的下載功能,不妨試試這個方案!

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-11-07 01:43:00

2022-09-14 10:16:12

MyBatis加密解密

2024-10-17 11:09:46

2025-07-08 02:12:00

2025-08-26 04:00:00

2024-09-27 15:24:15

Spring數據加解密

2025-07-03 02:11:00

Swing開發C++

2025-07-21 05:00:00

if-elseV1版本

2022-05-26 10:42:30

數據權限注解

2022-06-14 10:47:27

項目日志PUT

2022-07-15 14:26:36

開源工具IP

2021-10-19 18:22:50

Map 注冊表源碼

2021-09-24 15:00:26

微信PC電腦移動應用

2022-06-27 08:36:27

分布式事務XA規范

2024-02-19 00:21:45

開源圖片

2021-11-23 23:01:40

Windows微軟系統

2021-09-24 09:59:59

復制粘貼PythonPDF

2025-07-02 07:35:29

JSON字段SpringBoot

2019-07-24 10:50:56

Python 開發編程語言

2021-02-08 11:46:17

Python自動化郵件
點贊
收藏

51CTO技術棧公眾號

五月天丁香社区| 伊人再见免费在线观看高清版| 日韩欧美在线观看免费| 日韩在线二区| 欧美一区二区在线播放| 久久久精品2019中文字幕神马| 九九九九九国产| 都市激情久久综合| 91麻豆.com| 成人精品在线视频| 亚洲午夜福利在线观看| 久久久加勒比| 亚洲成人资源在线| 四虎永久国产精品| 国产免费高清视频| 深爱激情综合| 日韩一区二区三区四区| 国产99久久九九精品无码| 高清av在线| 成人18精品视频| 91久久精品美女高潮| 成人午夜视频在线播放| 中文字幕免费一区二区| 日韩精品视频观看| wwwxxxx在线观看| 国产韩日精品| 欧美视频在线观看免费网址| 好吊色视频988gao在线观看| 第三区美女视频在线| 99re成人精品视频| 99久久99久久精品国产片| 最新在线中文字幕| 日韩毛片视频| 日韩精品在线看| 性活交片大全免费看| 4438五月综合| 欧美久久高跟鞋激| 亚洲综合色在线观看| 欧美xoxoxo| 欧美性xxxx在线播放| 熟女视频一区二区三区| gogogo高清在线观看免费完整版| 91免费视频大全| 精品国产第一页| www.国产精品视频| 国产精品18久久久久久久久| 国产精品草莓在线免费观看| 中文人妻av久久人妻18| 久久国产欧美| 欧洲亚洲女同hd| 综合激情网五月| 国产精品久久久久久久久久妞妞| 久久全球大尺度高清视频| 精品无码一区二区三区电影桃花 | 狠狠色噜噜狠狠狠狠色吗综合| 国产精品免费无遮挡| 久久精品国产99| 国产日韩欧美在线视频观看| 中文字幕av影视| 蜜桃视频免费观看一区| 国产欧美日韩中文| 国产精品热久久| 韩国理伦片一区二区三区在线播放 | 日本午夜精品视频在线观看| 国产精品扒开腿做爽爽爽的视频| 中文字幕乱码一区二区| 六月丁香婷婷色狠狠久久| 国产日韩欧美在线看| 国内精品久久久久久久久久久| 国产精品自拍在线| 国产精品一区二| 四虎影院在线播放| 99精品视频中文字幕| 欧美一区1区三区3区公司| aaa日本高清在线播放免费观看| 国产精品午夜春色av| 亚洲二区自拍| 2021国产在线| 欧美性色19p| 亚洲欧美视频二区| 亚洲精品18| 日韩精品在线视频| 亚洲精品国产精品乱码在线观看| 亚洲视频电影在线| 97视频在线观看亚洲| 日韩国产成人在线| 国产又黄又大久久| 精品久久久久久综合日本| 国产三级在线免费观看| 亚洲欧美日韩精品久久久久| 无码av天堂一区二区三区| 欧美一区二区少妇| 中文字幕第一区第二区| 国产乱子伦精品视频| 日韩av中字| 91精品国产乱码| 精品夜夜澡人妻无码av| 亚洲国产aⅴ精品一区二区| 欧美www视频| 日本不卡一区在线| 91成人噜噜噜在线播放| 亚洲日本成人女熟在线观看| 久久久久成人精品无码中文字幕| 国产精品欧美日韩一区| 欧美理论电影在线观看| 国产在线观看第一页| 国产一区91精品张津瑜| 欧美日韩一区在线播放| 最新国产在线拍揄自揄视频| 在线看国产一区| 精品人妻伦一二三区久| 久久成人综合| 日本欧美爱爱爱| 性生活免费网站| 国产精品天干天干在线综合| 亚洲熟妇无码另类久久久| 伊人久久大香| 亚洲色图校园春色| 国产无遮挡又黄又爽又色| 国产中文一区| 国产精品久久久久久一区二区| 免费看av毛片| 亚洲精品自拍动漫在线| 麻豆三级在线观看| 免费不卡中文字幕在线| 97精品在线视频| 国产黄色一区二区| 亚洲视频综合在线| 伊人影院综合在线| 精品国产一级毛片| 91高潮精品免费porn| 亚洲精品久久久久久无码色欲四季| 国产精品你懂的在线| 粗暴91大变态调教| 日韩在线影视| 97欧美精品一区二区三区| 亚洲国产综合网| 一区二区在线观看不卡| 欧洲美女亚洲激情| 97精品一区| 国产精品入口尤物| 岛国大片在线观看| 91国产精品成人| 无码一区二区三区在线| 欧美精品一二| 国产成人精品久久二区二区| 在线观看国产一区二区三区| 久久久久成人黄色影片| 日韩网址在线观看| 久久不见久久见中文字幕免费| 91精品国产高清自在线看超| 污污网站在线免费观看| 久久久精品黄色| 黄色影院一级片| 美女毛片一区二区三区四区| 欧美综合一区第一页| 国产在线观看免费网站| 91久久国产最好的精华液| 舐め犯し波多野结衣在线观看| 久久这里只有| 亚洲欧洲国产精品久久| 久久亚洲国产精品尤物| 超碰日本道色综合久久综合| 精品国产无码一区二区| 午夜免费久久看| 久久丫精品国产亚洲av不卡| 天堂一区二区在线免费观看| 色一情一乱一伦一区二区三区| 欧美风情在线视频| 欧美成人激情图片网| 亚洲国产综合网| 欧美日韩性视频| 久久久久久久毛片| 久久99精品久久久| 91大学生片黄在线观看| 国产一区调教| 国产成人拍精品视频午夜网站| yw视频在线观看| 欧美一区二区免费观在线| 日韩免费观看一区二区| 久久久精品免费观看| 久久久久久久久久毛片| 亚洲国产一区二区精品专区| 国产精品成人一区| 天堂中文8资源在线8| 日韩一区二区三区三四区视频在线观看| 久久精品久久精品久久| 欧美激情一二三区| 制服下的诱惑暮生| 亚洲深夜激情| 一区二区三区在线观看www| japanese色系久久精品| 日韩免费观看网站| 成年人视频在线观看免费| 日韩女优av电影| 亚洲精品午夜国产va久久成人| 国产精品视频免费| 老司机免费视频| 麻豆国产欧美日韩综合精品二区| av久久久久久| 日本午夜一区| 国产aⅴ精品一区二区三区黄| 欧洲成人一区| 久久久久久久香蕉网| 久cao在线| 亚洲人av在线影院| 丁香花免费高清完整在线播放| 国产精品成人一区二区艾草| 韩国一区二区三区四区| 亚洲区综合中文字幕日日| 久久综合给合久久狠狠色| 国产亚洲字幕| 久热99视频在线观看| 日漫免费在线观看网站| 日韩欧美精品在线视频| 中文字幕在线观看高清| 狠狠躁夜夜躁人人爽超碰91| 高h视频免费观看| 国产欧美日本一区视频| 国产人妻人伦精品1国产丝袜| 国产久卡久卡久卡久卡视频精品| jizz欧美激情18| 国产欧美欧美| 国产乱淫av片杨贵妃| 亚洲最大av| 亚洲午夜在线观看| 精品国产aⅴ| 免费看成人片| 五月国产精品| 久久久水蜜桃| 国产精品久久久久久久久久白浆| 亚洲综合在线小说| 国产精品久久免费视频| 国产日韩在线视频| 成人深夜福利| 国产精品视频精品| 写真福利精品福利在线观看| 欧美综合国产精品久久丁香| 无码小电影在线观看网站免费| 久久全国免费视频| 国产夫妻在线| 96精品视频在线| 日韩激情电影免费看| 韩日欧美一区二区| av在线播放资源| 韩国三级电影久久久久久| av在线私库| 欧美一区二区三区免费视| 加勒比一区二区三区在线| 亚洲国内精品在线| 污污网站免费在线观看| 亚洲精品理论电影| 水莓100国产免费av在线播放| 亚洲精品久久久久久下一站 | 亚洲欧美激情一区| 麻豆影视在线| 欧美在线视频你懂得| 日本精品入口免费视频| 欧美日韩激情一区二区| 国产在线观看成人| 亚洲一二三区不卡| 欧美激情亚洲综合| 色偷偷88欧美精品久久久| 少妇视频一区二区| 亚洲视频1区2区| 久久久久久福利| 精品美女国产在线| 天天爱天天做天天爽| 欧美日韩一区久久| 99热这里只有精品在线| 亚洲第一精品夜夜躁人人躁| 日韩av地址| 色婷婷综合久久久久| 直接在线观看的三级网址| 国内精品一区二区三区| 你懂得影院夜精品a| 91精品久久久久久久久青青| 亚洲一区二区三区四区电影| 精品国产一区二区三区麻豆小说| 国产亚洲电影| 最近免费观看高清韩国日本大全| 亚洲高清不卡| 午夜视频你懂的| 国产成人亚洲精品狼色在线| www.久久av| 亚洲私人影院在线观看| 日本在线观看中文字幕| 91官网在线免费观看| 国内毛片毛片毛片毛片| 亚洲精品久久久久中文字幕欢迎你 | 日韩精品一区二区三区中文在线| 久久精品ww人人做人人爽| 日韩欧美三级| 日韩欧美一区二| 久久精品国产亚洲高清剧情介绍| 极品人妻一区二区| 国产午夜久久久久| 久久久久久久国产精品毛片| 色av一区二区| 四虎免费在线观看| 日韩欧美成人一区二区| 你懂的免费在线观看视频网站| 久久婷婷国产麻豆91天堂| 一区二区精品伦理... | 加勒比久久高清| 亚洲一区二区三区精品动漫| 日韩亚洲国产精品| 黄色aaaaaa| 国产午夜亚洲精品理论片色戒 | 91麻豆精品国产无毒不卡在线观看 | 欧美极度另类| 不卡视频一区二区三区| 日韩av二区| 国产熟女高潮视频| 成人精品一区二区三区四区 | 午夜免费久久看| www.久久色| 色吧影院999| 日韩a**中文字幕| 精品视频一区在线| 欧美性色综合| 九九热视频免费| 国产精品久久精品日日| 亚洲图片欧美日韩| 日韩国产精品一区| sm在线观看| 国产精品久久久久久久久久久久冷| 91久久电影| 国产免费视频传媒| 91亚洲国产成人精品一区二三| 欧美成人aaa片一区国产精品| 欧美挠脚心视频网站| 国产特黄在线| 国产精品久久久久久亚洲影视| 国产免费播放一区二区| 黄色一级片播放| 97se亚洲国产综合在线| 久久综合综合久久| 日韩欧美中文字幕精品| 91中文在线| 成人av影视在线| 欧美午夜精品| 女性生殖扒开酷刑vk| 亚洲福利视频三区| 欧美熟妇另类久久久久久不卡| 九九精品在线视频| 中文字幕一区二区三区四区久久| 51xx午夜影福利| 国产白丝精品91爽爽久久| 久久综合成人网| 亚洲精品wwww| 姬川优奈av一区二区在线电影| 欧美精品一区三区在线观看| 久久午夜影视| 国产三级在线观看完整版| 欧美日本视频在线| 国产精品久久久久久福利| 亚洲aaa激情| 亚洲国产午夜| 亚洲熟妇一区二区三区| 91成人免费在线视频| av在线免费一区| 91亚洲精品在线| 精品成人久久| 久久精品国产亚洲av久| 在线观看不卡一区| 国产在线观看91| 国产精品视频福利| 久久久久国产精品一区三寸| 国产一二三四视频| 欧美一区二区三区成人| sm久久捆绑调教精品一区| 国产亚洲欧美另类一区二区三区| 午夜一区不卡| frxxee中国xxx麻豆hd| 精品日韩在线观看| 中文日产幕无线码一区二区| 亚洲韩国在线| 成人黄色网址在线观看| av一级在线观看| 久久夜色撩人精品| 久久悠悠精品综合网| 自拍偷拍一区二区三区四区| 亚洲在线一区二区三区| 黄网站在线观看| 91免费精品视频| 性感少妇一区| 小早川怜子一区二区的演员表| 亚洲第一区第二区| 国产在视频一区二区三区吞精| 永久免费网站视频在线观看| 91麻豆福利精品推荐| 国产又粗又大又黄| 91sa在线看| 91精品推荐| 久久精品视频18| 精品日韩在线观看| 伊人亚洲精品| 成人小视频在线看| 亚洲一区二区视频在线|