Feign之Multipartfile文件传输填坑

网友投稿 688 2022-10-14


Feign之Multipartfile文件传输填坑

Multipartfile文件传输

1. 添加依赖

io.github.openfeign.form

feign-form

3.3.0

io.github.openfeign.form

feign-form-spring

3.3.0

2. 添加配置类

@Configuration

public class FeignMultipartConfig {

@Bean

@Primary

@Scope("prototype")

public SpringFormEncoder multipartFormEncoder() {

return new SpringFormEncoder();

}

@Bean

public feign.Logger.Level multipartLoggerLevel() {

return feign.Logger.Level.FULL;

}

}

3. 接口编写

@FeignClient使用配置类

@PostMapping设置

consumes = MediaType.MULTIPART_FORM_DATA_VALUE

使用@RequestPart(),不能使用@RequestParam()

@FeignClient(value = "face-service",configuration = FeignMultipartConfig.class)

pubhttp://lic interface FaceClient {

@PostMapping(value = "/search/student", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

ResponseBase searchStudentFace(@RequestPart("file") MultipartFile file);

}

feign不能正常传递参数MultipartFile(文件)的解决

之前工作中有个业务场景:需要把文件以MultipartFile进行服务之间的调用(使用的是Feign),特此记录下踩到的坑

需要注意的是:使用默认的springcloud自带的spring-cloud-starter-openfeign是不支持传递文件的。

我看网上有很多使用feign-form和feign-form-spring支持的jar包,然后配置SpringFormvncIRPyWOEncoder,但我试了,没有成功,最后使用了另外一种方法,在此记录下吧:

方法一:使用外部依赖

io.github.openfeign.form

feign-form

3.3.0

io.github.openfeign.form

feign-form-spring

3.3.0

新建配置类:

package com.jsyd.ict.ictservicemanager.configuration;

import org.springframework.beans.factory.ObjectFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.autoconfigure.http.HttpMessageConverters;

import org.springframework.cloud.openfeign.support.SpringEncoder;

import org.springframework.context.annotation.Bean;

import feign.codec.Encoder;

import feign.form.spring.SpringFormEncoder;

import org.springframework.context.annotation.Configuration;

/**

* 处制定了注入的feignFormEncoder可以覆盖掉原本的encoder

* 该方式可以让发送multipartFile成为可能

* @author wangyang

* @version 1.0

* @date 2021/4/13 19:13

*/

@Configuration

public class MultipartSupportConfig {

@Autowired

private ObjectFactory messageConverters;

@Bean

public Encoder feignFormEncoder() {

return new SpringFormEncoder(new SpringEncoder(messageConverters));

}

}

配置feign接口:

package com.jsyd.ict.ictservicemanager.feign;

import com.jsyd.ict.ictservicemanager.util.resp.RespUtil;

import org.springframework.cloud.openfeign.FeignClient;

import org.springframework.http.MediaType;

import org.springframework.web.bind.annotation.*;

import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedInputStream;

import java.io.File;

import java.io.InputStream;

/**

* 能力的调用

*

* @author wangyang

* @version 1.0

* @date 2021/3/11 21:01

*/

@FeignClient(name = "ict-service-capacity", configuration = MultipartSupportConfig.class)

public interface CapacityFeign {

@RequestMapping(value = "contentAudit/baiduImgAuditByFile", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

RespUtil baiduImgAuditByFile(@RequestPart(value = "file") MultipartFile file);

}

注意:文件的传输需要使用@RequestPart()注解

服务端:

@RequestMapping(value = "/baiduImgAuditByFile", method = RequestMethod.POST)

public RespUtil baiduImgAuditByFile(@RequestParam("file") MultipartFile file) {

// 调用service

return null;

}

结果发现,这样是获取不到结果的,研究了好一会,因为要着急联调,就没有继续跟踪了,有时间在深入研究下。

后来使用了下面的方法,成功传参

方法二:使用HttpServletRequest获取

上述操作都不需要,即:不需要导入依赖,也不需要创建文件,只需要在服务端通过HttpServletRequest去设置

使用HttpServletRequest设置:

伪代码如下:

@RequestMapping(value = "/baiduImgAuditByFile", method = RequestMethod.POST)

public RespUtil baiduImgAuditByFile(MultipartFile file, HttpServletRequest request) {

if (file == null) {

// 解决服务间调用无法接受MultipartFile参数的问题

String contentType = request.getContentType();

if (contentType != null && contentType.toLowerCase().startsWith("multipart/")) {

MultipartHttpServletRequest multipartRequest =

WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);

if (multipartRequest != null) {

MultiValueMap multiFileMap = multipartRequest.getMultiFileMap();

for (Map.Entry> entry : multiFileMap.entrySet()) {

file = entry.getValue().get(0);

}

}

}

}

// 处理业务逻辑

return null;

}

主要说明如下图:

即通过HttpServletRequest 的方式即使文件获取不到,也可以进行特殊处理,从而获取文件。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:AliRTC QoS 屏幕共享弱网优化之若干编码器相关优化
下一篇:华为HCIA-传输介质简介
相关文章

 发表评论

暂时没有评论,来抢沙发吧~