Springboot 一行代碼實(shí)現(xiàn)文件上傳 20個(gè)平臺(tái)致燥!少寫代碼到極致

大家好登疗,我是小富~

技術(shù)交流,公眾號(hào):程序員小富

又是做好人好事的一天嫌蚤,有個(gè)小可愛私下問我有沒有好用的springboot文件上傳工具辐益,這不巧了嘛,正好我私藏了一個(gè)好東西脱吱,順便給小伙伴們也分享一下智政,demo地址放在文末了。

[圖片上傳失敗...(image-22eaf9-1666669368274)]

文件上傳在平常不過的一個(gè)功能箱蝠,做后端開發(fā)的基本都會(huì)接觸到续捂,雖然不難可著實(shí)有點(diǎn)繁瑣。數(shù)據(jù)流的開閉宦搬、讀取還容易出錯(cuò)牙瓢,尤其是在對(duì)接一些OSS對(duì)象存儲(chǔ)平臺(tái),一個(gè)平臺(tái)一堆SDK代碼看起來亂糟糟的间校。

下邊給我大家推薦一個(gè)工具Spring File Storage矾克,上傳文件只要些許配置一行代碼搞定,開發(fā)效率杠杠的撇簿,一起看看是不是有這么流批聂渊!

官網(wǎng):https://spring-file-storage.xuyanwu.cn

Spring File Storage工具幾乎整合了市面上所有的OSS對(duì)象存儲(chǔ)平臺(tái),包括本地四瘫、FTP汉嗽、SFTPWebDAV找蜜、阿里云OSS饼暑、華為云OBS七牛云Kodo洗做、騰訊云COS弓叛、百度云 BOS又拍云USS诚纸、MinIO撰筷、京東云 OSS網(wǎng)易數(shù)帆 NOS等其它兼容 S3 協(xié)議的平臺(tái)畦徘,只要在springboot中通過極簡(jiǎn)的方式就可以實(shí)現(xiàn)文件存儲(chǔ)毕籽。

[圖片上傳失敗...(image-aa4d74-1666669368274)]

簡(jiǎn)單配置

下邊以本地和Aliyun OSS上傳為例抬闯,pom.xml中引入必要的spring-file-storage.jar注意: 如果要上傳文件到OSS平臺(tái)关筒,需要引入對(duì)應(yīng)平臺(tái)的SDK包溶握。

<!-- spring-file-storage 必須要引入 -->
<dependency>
    <groupId>cn.xuyanwu</groupId>
    <artifactId>spring-file-storage</artifactId>
    <version>0.5.0</version>
</dependency>

<!-- 阿里云oss -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

application.yml文件中配置些基礎(chǔ)信息。

  • enable-storage:只有狀態(tài)開啟才會(huì)被識(shí)別到
  • default-platform:默認(rèn)的上傳平臺(tái)
  • domain:生成的文件url中訪問的域名
  • base-path:存儲(chǔ)地址
  • thumbnail-suffix:縮略圖后綴

要是上傳OSS對(duì)象存儲(chǔ)平臺(tái)蒸播,將aliyun oss提供的變量配置到相應(yīng)的模塊上即可睡榆。

spring:
  #文件存儲(chǔ)配置(本地、oss)
  file-storage:
    default-platform: local-1
    thumbnail-suffix: ".min.jpg" #縮略圖后綴
    local:
      - platform: local-1 # 存儲(chǔ)平臺(tái)標(biāo)識(shí)
        enable-storage: true #是否開啟本存儲(chǔ)(只能選一種)
        enable-access: true #啟用訪問(線上請(qǐng)使用 Nginx 配置袍榆,效率更高)
        domain: "http://127.0.0.1:2222" #訪問域名胀屿,注意后面要和path-patterns保持一致,“/”結(jié)尾
        base-path: /tmp/Pictures/ # 存儲(chǔ)地址
        path-patterns: /** #訪問路徑
    aliyun-oss:
      - platform: aliyun-oss
        enable-storage: true
        access-key: xxxx
        secret-key: xxxx
        end-point: xxx
        bucket-name: firebook
        domain: http://fire100.top
        base-path: #云平臺(tái)文件路徑

springboot啟動(dòng)類中增加注解@EnableFileStorage包雀,顯式的開啟文件上傳功能碉纳,到這就可以用了

@EnableFileStorage // 文件上傳工具
@SpringBootApplication
public class SpringbootFileStorageApplication {

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

上傳文件

接下來在業(yè)務(wù)類中引入FileStorageService服務(wù),如下只要一行代碼就可以完成文件上傳馏艾,是不是So easy劳曹,下載也是如法炮制。

@RestController
public class FileController {

    @Autowired
    private FileStorageService fileStorageService;

    /**
     * 公眾號(hào):程序員小富
     * 上傳文件
     */
    @PostMapping(value = {"/upload"})
    public Object upload(MultipartFile file) {
        FileInfo upload  = fileStorageService.of(file).upload();
        return upload;
    }
}

我們用postman測(cè)試上傳一張圖片琅摩,看到圖片已經(jīng)成功傳到了/tmp/Pictures目錄下铁孵,返回結(jié)果中包含了完整的訪問文件的URL路徑。

[圖片上傳失敗...(image-8466da-1666669368274)]

[圖片上傳失敗...(image-4c0e9c-1666669368274)]

不僅如此spring-file-storage還支持多種文件形式房资,URI蜕劝、URLString轰异、byte[]岖沛、InputStreamMultipartFile搭独,使開發(fā)更加靈活婴削。

[圖片上傳失敗...(image-f0fb9-1666669368274)]

文件上傳功能,更多時(shí)候我們都是在上傳圖片牙肝,那就會(huì)有動(dòng)態(tài)裁剪圖片唉俗、生成縮略圖的需求,這些 spring-file-storage 都可以很容易實(shí)現(xiàn)配椭。

/**
 * 公眾號(hào):程序員小富
 * 上傳圖片裁剪大小并生成一張縮略圖
 */
@PostMapping("/uploadThumbnail")
public FileInfo uploadThumbnail(MultipartFile file) {
    return fileStorageService.of(file)
            .image(img -> img.size(1000,1000))  //將圖片大小調(diào)整到 1000*1000
            .thumbnail(th -> th.size(200,200))  //再生成一張 200*200 的縮略圖
            .upload();
}

而且我們還可以動(dòng)態(tài)選擇上傳平臺(tái)虫溜,配置文件中將所有平臺(tái)開啟,在實(shí)際使用中自由的選擇股缸。

/**
 * 公眾號(hào):程序員小富
 * 上傳文件到指定存儲(chǔ)平臺(tái)衡楞,成功返回文件信息
 */
@PostMapping("/upload-platform")
public FileInfo uploadPlatform(MultipartFile file) {
    return fileStorageService.of(file)
            .setPlatform("aliyun-oss")    //使用指定的存儲(chǔ)平臺(tái)
            .upload();
}

下載文件

下載文件也同樣的簡(jiǎn)單,可以直接根據(jù)文件url或者文件流下載敦姻。

/**
 * 公眾號(hào):程序員小富
 * 下載文件
 */
@PostMapping("/download")
public void download(MultipartFile file) {
    // 獲取文件信息
    FileInfo fileInfo = fileStorageService.getFileInfoByUrl("http://file.abc.com/test/a.jpg");
    
    // 下載到文件
    fileStorageService.download(fileInfo).file("C:\\a.jpg");

    // 直接通過文件信息中的 url 下載瘾境,省去手動(dòng)查詢文件信息記錄的過程
    fileStorageService.download("http://file.abc.com/test/a.jpg").file("C:\\a.jpg");

    // 下載縮略圖
    fileStorageService.downloadTh(fileInfo).file("C:\\th.jpg");
}

提供了監(jiān)聽下載進(jìn)度的功能坎背,可以清晰明了的掌握文件的下載情況。

// 下載文件 顯示進(jìn)度
fileStorageService.download(fileInfo).setProgressMonitor(new ProgressListener() {
    @Override
    public void start() {
        System.out.println("下載開始");
    }

    @Override
    public void progress(long progressSize,long allSize) {
        System.out.println("已下載 " + progressSize + " 總大小" + allSize);
    }

    @Override
    public void finish() {
        System.out.println("下載結(jié)束");
    }
}).file("C:\\a.jpg");

文件存在寄雀、刪除

我們還可以根據(jù)文件的URL地址來判斷文件是否存在、以及刪除文件陨献。

//直接通過文件信息中的 url 刪除盒犹,省去手動(dòng)查詢文件信息記錄的過程
fileStorageService.delete("http://file.abc.com/test/a.jpg");
//直接通過文件信息中的 url 判斷文件是否存在,省去手動(dòng)查詢文件信息記錄的過程
boolean exists2 = fileStorageService.exists("http://file.abc.com/test/a.jpg");

切面

工具還提供了每種操作的切面眨业,可以在每個(gè)動(dòng)作的前后進(jìn)行干預(yù)急膀,比如打日志或者玩點(diǎn)花活,實(shí)現(xiàn)FileStorageAspect類重寫對(duì)應(yīng)動(dòng)作的xxxAround方法龄捡。

**
 * 使用切面打印文件上傳和刪除的日志
 */
@Slf4j
@Component
public class LogFileStorageAspect implements FileStorageAspect {

    /**
     * 上傳卓嫂,成功返回文件信息,失敗返回 null
     */
    @Override
    public FileInfo uploadAround(UploadAspectChain chain, FileInfo fileInfo, UploadPretreatment pre, FileStorage fileStorage, FileRecorder fileRecorder) {
        log.info("上傳文件 before -> {}",fileInfo);
        fileInfo = chain.next(fileInfo,pre,fileStorage,fileRecorder);
        log.info("上傳文件 after -> {}",fileInfo);
        return fileInfo;
    }
}

demo案例地址:https://github.com/chengxy-nds/Springboot-Notebook/tree/master/springboot-file-storage

總結(jié)

用了這個(gè)工具確實(shí)極大的減少了上傳文件所帶來的代碼量聘殖,提升了開發(fā)效率晨雳,使用過程中暫未發(fā)現(xiàn)有什么坑,好東西就是要大家分享奸腺,如果符合你的需求餐禁,猶豫什么用起來吧。

技術(shù)交流突照,公眾號(hào):程序員小富

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帮非,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子讹蘑,更是在濱河造成了極大的恐慌末盔,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座慰,死亡現(xiàn)場(chǎng)離奇詭異陨舱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)版仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門隅忿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邦尊,你說我怎么就攤上這事背桐。” “怎么了蝉揍?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵链峭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我又沾,道長(zhǎng)弊仪,這世上最難降的妖魔是什么熙卡? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮励饵,結(jié)果婚禮上驳癌,老公的妹妹穿的比我還像新娘。我一直安慰自己役听,他們只是感情好颓鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著典予,像睡著了一般甜滨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘤袖,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天衣摩,我揣著相機(jī)與錄音,去河邊找鬼捂敌。 笑死艾扮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的占婉。 我是一名探鬼主播栏渺,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锐涯!你這毒婦竟也來了磕诊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤纹腌,失蹤者是張志新(化名)和其女友劉穎霎终,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體升薯,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莱褒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涎劈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片广凸。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛛枚,靈堂內(nèi)的尸體忽然破棺而出谅海,到底是詐尸還是另有隱情佣蓉,我是刑警寧澤豁陆,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蜓斧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侥袜。R本人自食惡果不足惜蝌诡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枫吧。 院中可真熱鬧浦旱,春花似錦、人聲如沸九杂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尼酿。三九已至,卻和暖如春植影,著一層夾襖步出監(jiān)牢的瞬間裳擎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工思币, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹿响,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓谷饿,卻偏偏與公主長(zhǎng)得像惶我,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子博投,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Azure Blob 存儲(chǔ)是 Microsoft 提供的適用于云的對(duì)象存儲(chǔ)解決方案绸贡。 Blob 存儲(chǔ)最適合存儲(chǔ)巨量...
    永動(dòng)的圖靈機(jī)閱讀 1,757評(píng)論 1 0
  • 基于Spring Boot的文件上傳上傳方式:1.直接上傳到應(yīng)用服務(wù)器2.上傳到OSS(內(nèi)容存儲(chǔ)服務(wù)器,如:阿里云...
    洋baby閱讀 787評(píng)論 0 1
  • 基于Spring Boot的文件上傳上傳方式:1.直接上傳到應(yīng)用服務(wù)器2.上傳到OSS(內(nèi)容存儲(chǔ)服務(wù)器毅哗,如:阿里云...
    皮皮力_996a閱讀 36,650評(píng)論 1 5
  • 文件上傳方式:1.直接上傳到應(yīng)用服務(wù)器(速度听怕,容量) 2.上傳到oss(內(nèi)容存儲(chǔ)服務(wù)器)(阿里云,七牛云)3.前端...
    六年的承諾閱讀 1,775評(píng)論 0 4
  • 文件上傳的操作是我們JavaWeb開發(fā)中經(jīng)常會(huì)用到的操作虑绵,同時(shí)既然是文件尿瞭,那么還需要控制文件的大小等操作,以前怎么...
    遼A丶孫悟空閱讀 1,526評(píng)論 1 14