使用Feign文件上传 - multipart / form-data

时间:2015-07-31 18:27:02

标签: java netflix-feign

我正在尝试使用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--

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

4 个答案:

答案 0 :(得分:3)

不,你不是。您只需要定义一种代理接口方法,将内容类型指定为: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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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


using ActualDataFormat =
    typename std::conditional<std::is_same<tType, bool>::value,
                  DataFormatBool,
                  typename std::conditional<
                      std::is_same<tType, float>::value,
                      DataFormatFloat,
                      DataFormatDouble>::type
                  >::type;

public class FeignConfig {
     
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

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

答案 3 :(得分:0)

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

var express = require('express');
var router = express.Router();
router.get('/', function(req, res, next) {
  ...
});
module.exports = router;

您需要在伪客户端调用中将@RequestParam更改为@RequestPart,以使其正常运行,并将消耗添加到@PostMapping中。