1. 程式人生 > 其它 >feign上傳檔案

feign上傳檔案

技術標籤:Eureka

feign上傳檔案

注意:

  • 請求方式必須是POST
  • consumes必須指定為Media=MediaType.MULTIPART_FORM_DATA_VALUE
  • produces 須指定為 MediaType.APPLICATION_JSON_UTF8_VALUE
  • 上傳引數的名字最好保持一致
  • 在這裡插入圖片描述

引入依賴

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

在UserController中接收引數

    @PostMapping(value = "/user/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadPic(MultipartFile file){
        //委託FeignClient進行遠端呼叫
        return userService.uploadPic(file);
    }

FeignClient

由userController呼叫Feign客戶端

編輯配置類MultipartConfig

public class MultipartConfig {
    @Bean
    @Scope("prototype")
    public Encoder encoder(){
        return new SpringFormEncoder();
    }
}
@FeignClient(name = "user-provider",configuration = MultipartConfig.class)
public interface UserService {
    @PostMapping(value = "/user/upload",
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String uploadPic(@RequestPart("file") MultipartFile file);
}

user-provider

由Feign遠端呼叫user-provider的controller,程式碼如下

  @PostMapping(value = "/user/upload",
        produces = MediaType.APPLICATION_JSON_UTF8_VALUE,
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadPic(MultipartFile file,HttpServletRequest request){
        return userService.uploadPic(file,request);
    }

具體實現檔案在本地儲存

 @PostMapping(value = "/user/upload",produces = MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadPic(MultipartFile file){
        //獲取專案在此電腦上的真實路徑
        String fileTrue = System.getProperty("user.dir");
        String videoName = file.getOriginalFilename();//獲取檔名稱
        fileTrue += "\\file\\";


            try {
                byte[] bytes = file.getBytes();
                Path path = Paths.get(fileTrue + file.getOriginalFilename());
                //如果沒有files資料夾,則建立
                if (!Files.isWritable(path)) {
                    Files.createDirectories(Paths.get(fileTrue));
                }
                //短視訊檔案寫入指定路徑
                Files.write(path, bytes);
                String pathVideo = String.valueOf(path);
                //編寫檔案操作邏輯,現在只是將檔名返回
                //return file.getOriginalFilename();
                return pathVideo;//上傳檔案儲存路徑
            } catch (IOException e) {
                e.printStackTrace();
            }

        return "上傳失敗";
    }