Spring Cloud Feign MultipartFile上传

3

我在Spring Cloud上有客户端角色微服务和服务器角色微服务。我在客户端微服务上有一个FeignClient bean,它有一个接受MultipartFile的方法,如下所示:

@RequestMapping(value = {"/files"}, consumes = {"multipart/form-data"}, method = {RequestMethod.POST}
)
ResponseEntity uploadFile(@RequestBody MultipartFile file, @RequestParam("someParam") String someParam)

通过使用以下两个库: "io.github.openfeign.form:feign-form:3.0.3" "io.github.openfeign.form:feign-form-spring:3.0.3"

可以像这样配置feign以进行文件上传:

@Configuration
public class FeignConfiguration {

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

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

然后在Feign客户端中以如下方式引用配置:
@FeignClient(name = "destination-microservice-id", configuration = FeignConfiguration.class)

如何实现MultipartFile接口以及如何创建实例以处理来自客户微服务的调用? 在使用Spring的MockMultipartFile实现进行测试时,它们几乎都能正常工作。文件被传输,“someParam”值也被传输。但是,作为MultipartFile实例的其他字段——内容类型和文件名并未传递到服务器。

有什么好的解决方法吗?


除了MockMultipartFile之外,另一个实现是Spring的CommonsMultipartFile类。 - Mihaita Tinta
我看过这个实现,但它看起来像是为服务器端处理而创建的东西。 - Lukas S
1个回答

3
为了从客户端微服务应用程序调用您的伪客户端接口,您可以使用类似以下代码的内容。
public void uploadFile(File file) {

    DiskFileItem fileItem = (DiskFileItem) new DiskFileItemFactory().createItem("file",
                                                MediaType.TEXT_PLAIN_VALUE, true, file.getName());

    try (InputStream input = new FileInputStream(file); OutputStream os = fileItem.getOutputStream()) {
        IOUtils.copy(input, os);
    } catch (Exception e) {
        throw new IllegalArgumentException("Invalid file: " + e, e);
    }

    MultipartFile multipartFile = new CommonsMultipartFile(fileItem);
    feignClient.uploadFile(multipartFile);
}

DiskFileItem类来自commons-fileupload库。希望对您有所帮助。


我尝试了这个解决方案,在服务器端没有看到错误,但在客户端出现了400错误。上传数据室时出错:[400] 在 [http://localhost:8080/api/file?path=11/200/rfi&fileName=Intial_23_1587736552682.xml&documentType=Other&explanation=Intial_23_1587736552682.xml&authorityOnly=false] [datauploadClient#uploadFile(MultipartFile,String,String,String,String,boolean)]期间:[] - user12639212
你能否增加服务器端的日志记录,以查看问题所在? - Mihaita Tinta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接