【问题标题】:File Upload Using Feign - multipart/form-data使用 Feign 上传文件 - multipart/form-data
【发布时间】:2015-10-23 12:33:01
【问题描述】:

我正在尝试使用 feign 完成分段文件上传,但我似乎无法在任何地方找到它的好例子。我本质上希望 HTTP 请求与此类似:

...
Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="name"

Larry
--AaB03x
   Content-Disposition: form-data; name="file"; filename="file1.txt"
   Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

甚至……

------fGsKo01aQ1qXn2C
Content-Disposition: form-data; name="file"; filename="file.doc"
Content-Type: application/octet-stream

... binary data ...

------fGsKo01aQ1qXn2C--

是否需要手动构建请求正文,包括生成多部分边界?考虑到这个客户可以做的所有其他事情,这似乎有点过分了。

【问题讨论】:

    标签: java netflix-feign


    【解决方案1】:

    MBozic 解决方案不完整,您还需要为此启用编码器:


    public class FeignConfig {
         
        @Autowired
        private ObjectFactory<HttpMessageConverters> messageConverters;
    
        @Bean
        public Encoder feignFormEncoder () {
            return new SpringFormEncoder(new SpringEncoder(messageConverters));
        }
    }
    

    @FeignClient(name = "file", url = "http://localhost:8080", configuration = FeignConfig.class)
    public interface UploadClient {
        @PostMapping(value = "/upload-file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
        String fileUpload(@RequestPart(value = "file") MultipartFile file);
    }
    

    【讨论】:

      【解决方案2】:

      对于 spring boot 2 和 spring-cloud-starter-openfeign 使用以下代码:

      @PostMapping(value="/upload", consumes = "multipart/form-data" )
      QtiPackageBasicInfo upload(@RequestPart("package") MultipartFile package);
      

      您需要在 feign 客户端调用中将 @RequestParam 更改为 @RequestPart 以使其工作,并且还需要向 @PostMapping 添加消费。

      【讨论】:

        【解决方案3】:

        不,你没有。您只需要定义一种代理接口方法,指定content-type为:multipart/form-data以及远程API所需的参数等其他信息。这是一个例子:

        public interface FileUploadResource {
        
            @RequestLine("POST /upload")
            @Headers("Content-Type: multipart/form-data")
            Response uploadFile(@Param("name") String name, @Param("file") File file);
        
        } 
        

        完整的例子可以在这里找到:File Uploading with Open Feign

        【讨论】:

          【解决方案4】:

          如果您已经在使用 Spring Web,您可以尝试我的 Feign Encoder 实现,它能够创建 Multipart 请求。它可以发送单个文件、一组文件以及一个或多个额外的 JSON 有效负载。 这是我的test project。如果不使用 Spring,可以通过更改 FeignSpringFormEncoder 中的 encodeRequest 方法来重构代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-01
            • 2016-12-14
            • 1970-01-01
            相关资源
            最近更新 更多