精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美色爱综合| 亚洲精品成a人ⅴ香蕉片| 26uuu欧美| 国产精品视频免费观看www| 你懂得在线观看| 日韩免费一级| 色网站国产精品| 一区二区三区四区久久| 姝姝窝人体www聚色窝| 日韩福利电影在线| 欧美黑人极品猛少妇色xxxxx| 亚洲第九十七页| 91精品国产一区二区在线观看| 亚洲午夜精品一区二区三区他趣| 日韩欧美亚洲区| 亚洲精品视频专区| 美女看a上一区| 午夜精品蜜臀一区二区三区免费| 亚洲一二三四视频| 欧美顶级毛片在线播放| 欧美日韩高清在线播放| 黄色国产一级视频| a视频在线观看| 久久综合色婷婷| 91免费版黄色| 在线观看日批视频| 国产精品日本| 欧美精品国产精品日韩精品| 午夜国产福利视频| 视频精品在线观看| 日韩av影片在线观看| 亚洲AV成人精品| 久久不卡日韩美女| 91成人免费电影| 91视频最新入口| 波多野结衣在线观看| 亚洲精品国产第一综合99久久 | 亚洲视频图片小说| 欧美中文娱乐网| 无码国产伦一区二区三区视频 | 伊人网综合视频| 国产精品视频一区二区三区| 在线一区二区视频| 免费日韩中文字幕| 涩涩涩视频在线观看| 亚洲电影在线播放| 欧美日韩激情四射| 成人免费网站在线观看视频| 国产精品传媒入口麻豆| 日韩免费毛片| jizz在线观看视频| 国产日韩av一区| 清纯唯美一区二区三区| 青青草免费在线视频| 99久久精品国产毛片| 国产亚洲精品自在久久| 日本毛片在线观看| 成人av免费网站| 极品校花啪啪激情久久| 成人久久久精品国产乱码一区二区 | 中文字幕亚洲在| 亚洲成人网上| 97超碰国产一区二区三区| 国产午夜精品久久| 四虎一区二区| 久久日韩视频| 一区二区在线观看视频| 男人添女人荫蒂免费视频| 欧美人与禽猛交乱配| 亚洲成人激情综合网| 欧美综合在线播放| 午夜欧美巨大性欧美巨大 | 婷婷成人综合| 亚洲欧洲在线视频| 毛片视频免费播放| 亚洲精品a级片| 久久久久久久久久国产精品| 天海翼一区二区| 日韩精品电影一区亚洲| 国产精品久久久久久五月尺| 一级特黄aaaaaa大片| 国产精品18久久久| 精品日韩美女| 国产高清视频免费最新在线| 国产精品久久久久久久久动漫| 三年中国中文在线观看免费播放| av小次郎在线| 精品久久久在线观看| 超碰在线人人爱| 日韩欧国产精品一区综合无码| 3751色影院一区二区三区| 风韵丰满熟妇啪啪区老熟熟女| 亚洲人成精品久久久| 日韩在线视频播放| 精品在线视频免费| 免费视频最近日韩| 国产福利一区二区三区在线观看| 天天综合在线视频| 国产精品久久一级| 少妇高潮毛片色欲ava片| 福利一区二区三区视频在线观看| 日韩午夜中文字幕| 野外性满足hd| 亚洲免费二区| 国产不卡av在线免费观看| 国产精品久久影视| 99精品久久99久久久久| 国产福利片一区二区| 五月天av在线| 日韩你懂的电影在线观看| 波多野结衣av在线观看| 国产精品www.| 国产欧美 在线欧美| 深夜福利视频在线观看| 亚洲三级免费观看| 日韩福利视频在线| 黄色网一区二区| 另类少妇人与禽zozz0性伦| 精品国产一区二区三区四| 国产电影一区二区三区| 亚洲午夜精品一区二区三区| www.成人爱| 日韩欧美国产wwwww| 成人在线观看免费高清| 国产亚洲网站| 国产丝袜不卡| 国产91足控脚交在线观看| 欧美精品99久久久**| 午夜时刻免费入口| 国产一区成人| 精品乱色一区二区中文字幕| 久久青青色综合| 欧美一区二区免费观在线| 国产黄色片在线| 日本不卡在线视频| 欧美在线3区| 女海盗2成人h版中文字幕| 欧美v国产在线一区二区三区| 中文字幕电影av| 久久99久久99| 亚洲免费视频一区| 成人黄色在线| 伊人成人开心激情综合网| 中文字幕69页| 久久久久久黄色| 波多野结衣50连登视频| 精品无人区一区二区| 欧美国产日韩xxxxx| 亚洲av无码片一区二区三区| 亚洲精品菠萝久久久久久久| ass极品水嫩小美女ass| 欧美激情在线| 国产91免费视频| 91吃瓜在线观看| 亚洲精品国偷自产在线99热| 亚洲一区欧美在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲free性xxxx护士hd| 精品51国产黑色丝袜高跟鞋| 69堂精品视频| 澳门黄色一级片| 成人精品国产免费网站| 国产av天堂无码一区二区三区| 精品国内亚洲2022精品成人| 欧美一级免费视频| 国产午夜精品一区理论片| 欧美亚洲精品一区| 97在线观看免费高| 高潮精品一区videoshd| 免费看一级大黄情大片| 国产麻豆一区二区三区精品视频| 国产精品久久久久久久天堂| 国产激情在线视频| 欧美精品一区二区三区四区| 三级视频在线观看| 国产精品伦一区| 激情小说欧美色图| 免费在线日韩av| 一区二区三区四区欧美| 一级毛片精品毛片| 青青精品视频播放| 欧美私人网站| 日韩欧美国产一区二区三区 | 日本欧美电影在线观看| 亚洲激情成人网| 中文在线免费看视频| 一区二区成人在线| 香蕉视频黄色在线观看| 精品亚洲成a人| 婷婷五月综合缴情在线视频| 国产一区二区观看| 亚洲综合在线播放| 一级毛片久久久| 欧美超级免费视 在线| 三级黄视频在线观看| 9191成人精品久久| 日韩久久中文字幕| 亚洲美女精品一区| 精品无人区无码乱码毛片国产| 精品中文字幕一区二区小辣椒| 日韩精品综合在线| 成人在线免费视频观看| 俄罗斯精品一区二区| 99久久综合国产精品二区| 久久久亚洲精品视频| 日本三级在线视频| 亚洲女同精品视频| 成人午夜视频一区二区播放| 欧美三级在线视频| 91蜜桃视频在线观看| 亚洲视频1区2区| 久久精品视频18| 成人av电影在线播放| 黄色片视频在线| 国产一区二区精品| 国产精品成人久久电影| 欧美国产美女| 日韩av一区二区三区在线| 好吊妞视频这里有精品 | 久久久久五月天| 黄网页在线观看| 一区二区三欧美| 人成免费电影一二三区在线观看| 日韩美一区二区三区| 国产又粗又长视频| 欧洲亚洲精品在线| 日本高清不卡码| 精品久久香蕉国产线看观看gif| 久草视频手机在线观看| 亚洲精品综合在线| 精品在线观看一区| 国产精品的网站| 国产日韩精品中文字无码| 久久久.com| 毛片网站免费观看| 99re热这里只有精品视频| 无码人妻一区二区三区精品视频| 国产一区二区三区精品视频| 91 在线视频观看| 免费高清不卡av| 亚洲欧美久久久久| 久久精品av麻豆的观看方式| 国产 porn| 免费观看成人av| 邪恶网站在线观看| 全部av―极品视觉盛宴亚洲| 好男人www社区| 蜜芽一区二区三区| 亚洲欧美aaa| 九九国产精品视频| 91亚洲一区二区| 国产成人精品亚洲777人妖| 自拍视频第一页| 成人午夜精品在线| 少妇一级淫片免费放播放| 成人精品一区二区三区四区| 2018国产精品| 99久久精品国产毛片| www.中文字幕av| 国产人成亚洲第一网站在线播放| 日韩影视一区二区三区| 中文字幕在线观看不卡视频| 五月天色婷婷丁香| 一区二区三区四区在线| 日韩av在线播放观看| 欧美日韩在线影院| 亚洲精品一区二三区| 欧美日韩国产首页| 超碰在线人人干| 日韩精品极品视频免费观看| 精品无吗乱吗av国产爱色| 色av中文字幕一区| 日韩另类在线| 69久久夜色精品国产69| 欧美色片在线观看| 亚洲一区二区三区视频| 牛牛影视一区二区三区免费看| 欧美日韩精品免费在线观看视频| 日本大胆欧美| 免费的一级黄色片| 久久看片网站| 91热视频在线观看| 成人动漫一区二区| 日本污视频网站| 亚洲综合免费观看高清完整版在线| 精品成人久久久| 欧美高清你懂得| 香蕉av一区二区三区| www.久久久久久.com| 国产高潮在线| 国产精品一区二区三区在线播放 | www国产亚洲精品久久麻豆| 午夜黄色福利视频| 亚洲成人在线网站| 中文字幕 国产| 亚洲电影免费观看高清完整版在线观看 | 亚洲一级视频在线观看| 欧美va在线播放| 黄色影院在线播放| 欧美极品少妇xxxxⅹ免费视频| 97精品国产综合久久久动漫日韩 | 欧美三级情趣内衣| 亚洲色欲久久久综合网东京热| 免费视频最近日韩| 特大黑人巨人吊xxxx| 亚洲品质自拍视频| 中文字幕 国产精品| 精品88久久久久88久久久| seseavlu视频在线| 日av在线播放中文不卡| 亚洲电影一区| 亚洲日本无吗高清不卡| 国产农村妇女精品一区二区| 人妻换人妻仑乱| 国产精品青草久久| 男人天堂2024| 亚洲第一av网| 日韩伦理电影网站| 91免费版网站入口| 日韩一区欧美| aaaaaa亚洲| 2024国产精品视频| 国产一级淫片a| 欧美白人最猛性xxxxx69交| 免费av网站在线看| 国产精品黄色影片导航在线观看| 牛牛精品成人免费视频| 久久久久久久久久伊人| 狠狠色丁香久久婷婷综合_中 | 国产精品久久久久久超碰| 日韩欧美黄色| 少妇高潮喷水在线观看| 成人自拍视频在线| 国产小视频在线看| 日韩一区二区三区三四区视频在线观看 | 成人精品在线| 亚洲激情电影在线| 日韩精品乱码免费| 四虎国产精品成人免费入口| 色综合久久88色综合天天| 天天av综合网| 欧美壮男野外gaytube| 蜜桃一区av| 国产美女网站在线观看| 91亚洲资源网| 6080午夜伦理| 亚洲视频在线免费观看| 色香欲www7777综合网| 翔田千里亚洲一二三区| 免费在线观看一区二区三区| 在线观看日本中文字幕| 欧美网站一区二区| 欧美三级电影一区二区三区| 国产日产久久高清欧美一区| 欧美3p在线观看| 亚洲综合20p| 一区二区三区四区视频精品免费 | 97av在线视频免费播放| 欧美丝袜美腿| 国产精品亚洲αv天堂无码| 国产午夜精品久久久久久久| 一区二区视频播放| 久久精品一区中文字幕| 五月亚洲婷婷| 毛片在线播放视频| 国产午夜精品福利| 国产又粗又黄又爽| 欧美激情亚洲自拍| 天堂网av成人| 在线观看免费av网址| 亚洲一区二区av在线| 深夜视频在线免费| 国产精品久久久久久婷婷天堂| 91精品国偷自产在线电影| 人妻互换一二三区激情视频| 一本色道久久加勒比精品| 黄色成人在线| 久久久久久九九九九| 美女视频黄久久| 久久精品国产亚洲av高清色欲| 亚洲人成电影网站| 国产亚洲亚洲国产一二区| 五十路熟女丰满大屁股 | 一区二区三区免费高清视频 | 色呦呦在线免费观看| 蜜桃视频在线观看成人| 狠狠色综合色综合网络| 久久精品无码人妻| 最近2019年日本中文免费字幕| 欧洲精品99毛片免费高清观看| 国产二级片在线观看| 国产精品色呦呦| 色欲av伊人久久大香线蕉影院| 国产精品福利久久久| 欧美日韩亚洲一区| 少妇太紧太爽又黄又硬又爽小说| 精品国产污污免费网站入口| av成人免费| 久久久久久久久久久视频| 亚洲啪啪综合av一区二区三区|