【问题标题】:Spring Cloud Feign MultipartFile uploadSpring Cloud Feign MultipartFile 上传
【发布时间】:2018-06-14 09:53:21
【问题描述】:

我在 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 类
  • 我见过这个实现,但它看起来像是为服务器端处理创建的东西

标签: java spring multipartform-data spring-cloud-feign


【解决方案1】:

要从您的客户端微服务应用程序调用您的 feign 客户端接口,您可以使用类似的东西。

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 错误 上传数据室时出错:[POST] 期间 [400] 到 [localhost:8080/api/file?path=11/200/… [datauploadClient#uploadFile(MultipartFile ,String,String,String,String,boolean)]: []
  • 能不能增加服务器端的日志看看有什么问题?
猜你喜欢
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2017-07-23
  • 2015-10-21
  • 2018-08-31
相关资源
最近更新 更多