OpenFeign 文件上傳下載

由于自己也是在網(wǎng)上幾經(jīng)一番折騰才找到部分博客并加以修改實(shí)現(xiàn); 話不多說直接上代碼;

1.1 文件上傳之服務(wù)端代碼(在此處以服務(wù)端內(nèi)部上傳OSS為例)

     @PostMapping(value = "upload")
    public BaseResult<String> test(MultipartFile file) {
        String downloadUrl = fileService.upload(file);
        Preconditions.checkArgument(StringUtils.isNotEmpty(downloadUrl), UPLOAD_FILE_ERROR);
        return BaseResult.generateSuccessRestlt(downloadUrl);
    }
  
      @Override
    public String upload(MultipartFile file) {
        String filename = file.getOriginalFilename();
        try (InputStream inputStream = file.getInputStream()) {
            PutObjectRequest putObjectRequest = new PutObjectRequest(fileConfig.getBucketName(),
                filename, inputStream);
            ossClient.putObject(putObjectRequest);
        } catch (IOException e) {
            log.error("filename:[{}],獲取文件輸入流錯(cuò)誤!", filename, e);
            return null;
        } catch (OSSException | ClientException e) {
            log.info("上傳文件失敗filename:[{}]", filename, e);
            return null;
        }
        return filename;
    }

1.2 文件下載之服務(wù)端代碼

      @GetMapping(value = "download")
    public void down(@RequestParam(value = "filename") String filename,
        HttpServletResponse response) {
        fileService.download(filename, response);
    }

      @Override
    public void download(String filepath, HttpServletResponse response) {
        response
            .setContentType("application/x-download;charset=" + Charsets.UTF_8.displayName());
        response.addHeader("Content-Disposition",
            "attachment;filename=" + this.reWriteChinese(filepath));
        // ossObject包含文件所在的存儲(chǔ)空間名稱、文件名稱闷愤、文件元信息以及一個(gè)輸入流。
        OSSObject ossObject;
        try {
            ossObject = ossClient.getObject(fileConfig.getBucketName(), filepath);
        } catch (OSSException | ClientException e) {
            log.error("獲取OSS文件連接異常,filePath:[{}]", filepath, e);
            return;
        }

        try (OutputStream outputStream = response.getOutputStream();
            InputStream inputStream = ossObject.getObjectContent()) {
            IOUtils.copy(inputStream, outputStream);
            outputStream.flush();
        } catch (IOException e) {
            log.error("下載文件異常 filepath:[{}]", filepath, e);
        }
    }

1.3 文件上傳和下載FeignClient調(diào)用方代碼

  /*
 * Copyright (c) 2020 daguimu.geek@gmail.com
 * All rights reserved.
 *
 */
package com.dagm.api.feignclient;

import feign.Response;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

/**
 * @author Guimu
 * @date 2020/01/08
 */
@FeignClient(value = "file-service", configuration = FileFeign.MultipartSupportConfig.class)
public interface FileFeign {

    /**
     * 調(diào)用feign 對(duì)文件進(jìn)行上傳
     *
     * @param file 待上傳的文件
     * @return com.dagm.shorter.res.BaseResult<java.lang.String>
     * @author Guimu
     * @date 2020/1/8
     */
    @PostMapping(value = "/inner/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    BaseResult<String> upload(@RequestPart("file") MultipartFile file);

    /**
     * 文件下載
     *
     * @return feign.Response
     * @author Guimu
     * @date 2020/1/8
     */
    @GetMapping(value = "/inner/download")
    Response download(@RequestParam("filename") String filename);

    class MultipartSupportConfig {

        @Bean
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder();
        }
    }
}

1.4 tip:

  1. 文件的上傳下載服務(wù)端代碼, 和一般的上傳下載一樣:
    OpenFeign 文件上傳需要配置Encoder, 我這里用的是feign-form; 也可以選擇其他的;
    feign-form 版本對(duì)應(yīng) 3.5版本之后的對(duì)應(yīng)OpenFeign 10.* , 3.5版本之前的對(duì)應(yīng)OpenFeign9.*

1.5 相關(guān)的pom 依賴

     <dependency>
      <groupId>io.github.openfeign.form</groupId>
      <artifactId>feign-form</artifactId>
      <version>3.4.1</version>
    </dependency>
    <dependency>
      <groupId>io.github.openfeign.form</groupId>
      <artifactId>feign-form-spring</artifactId>
      <version>3.4.1</version>
    </dependency>

1.6 附加一個(gè)調(diào)用方使用OpenFeign 上傳文件和下載并返回給調(diào)用方客戶端的demo

   
   @PostMapping(value = "upload")
   public BaseResult<String> test(MultipartFile file) {
       return fileFeign.upload(file);
   }

   @GetMapping(value = "download")
   public void download(@RequestParam(value = "filename") String filename,
       HttpServletResponse httpServletResponse) {
       httpServletResponse
           .setContentType("application/x-download;charset=" + Charsets.UTF_8.displayName());
       httpServletResponse.addHeader("Content-Disposition",
           "attachment;filename=" + this.reWriteChinese(filename));
       Response response = fileFeign.download(filename);
       Response.Body body = response.body();
       try (OutputStream outputStream = httpServletResponse.getOutputStream();
           InputStream inputStream = body.asInputStream()) {
           IOUtils.copy(inputStream, outputStream);
           outputStream.flush();
       } catch (IOException e) {
           log.error("下載文件異常 filepath:[{}]", filename, e);
       }
   }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窍蓝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洪唐,更是在濱河造成了極大的恐慌荷科,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段只,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鉴扫,警方通過查閱死者的電腦和手機(jī)赞枕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坪创,“玉大人炕婶,你說我怎么就攤上這事±吃ぃ” “怎么了柠掂?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锁施。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么悉抵? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任肩狂,我火速辦了婚禮,結(jié)果婚禮上姥饰,老公的妹妹穿的比我還像新娘傻谁。我一直安慰自己,他們只是感情好列粪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布审磁。 她就那樣靜靜地躺著,像睡著了一般岂座。 火紅的嫁衣襯著肌膚如雪态蒂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天费什,我揣著相機(jī)與錄音钾恢,去河邊找鬼。 笑死鸳址,一個(gè)胖子當(dāng)著我的面吹牛瘩蚪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稿黍,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼疹瘦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了巡球?” 一聲冷哼從身側(cè)響起言沐,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辕漂,沒想到半個(gè)月后呢灶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钉嘹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鸯乃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跋涣。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缨睡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陈辱,到底是詐尸還是另有隱情奖年,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布沛贪,位于F島的核電站陋守,受9級(jí)特大地震影響震贵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜水评,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一猩系、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧中燥,春花似錦寇甸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咱扣,卻和暖如春绽淘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偏窝。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工收恢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祭往。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓伦意,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硼补。 傳聞我的和親對(duì)象是個(gè)殘疾皇子驮肉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 背景 ? Spring Cloud現(xiàn)在已經(jīng)被越來越多的公司采用了,微服務(wù)架構(gòu)比傳統(tǒng)意義上的單服務(wù)架構(gòu)從復(fù)雜度上多了...
    fad2aa506f5e閱讀 4,424評(píng)論 1 3
  • 什么是文件上傳漏洞已骇? 文件上傳漏洞是指由于程序員在對(duì)用戶文件上傳部分的控制不足或者處理缺陷离钝,而導(dǎo)致的用戶可以越過其...
    Smi1e_閱讀 24,710評(píng)論 0 24
  • 一卵渴、文件上傳介紹 要將客戶端(瀏覽器)大數(shù)據(jù)存儲(chǔ)到服務(wù)器端,不將數(shù)據(jù)直接存儲(chǔ)到數(shù)據(jù)庫中鲤竹,而是要將數(shù)據(jù)存儲(chǔ)到服務(wù)器所...
    圣賢與無賴閱讀 1,071評(píng)論 0 16
  • [TOC] Feign 什么是Feign: Feign是Netflix開源的聲明式Http客戶端 關(guān)于Feign的...
    端碗吹水閱讀 1,417評(píng)論 0 1
  • A:在核心商圈開展活動(dòng) M:因?yàn)榫W(wǎng)格以來第一次在商圈開展活動(dòng)浪读,怕出錯(cuò),緊張 B:第一次在商圈與街道社區(qū)合作辛藻,主要的...
    五福陳閱讀 196評(píng)論 0 0