如何使用Feign实现多文件上传,Open Feign多文件上传解决方案
废话不多说,直接上代码
用feign多文件上传的Controller代码如下
@Slf4j @RestController @RequestMapping("/store") @Api(description = "店铺管理接口", tags = "店铺管理接口") public class StoreController {
@Autowired private StoreService storeService; @ApiOperation(value = "新增店铺信息") @PostMapping(value = "/addStoreInfo") public Result<Store> addStoreInfo(@Valid @ApiParam(value = "添加店铺时的店铺") StoreDto storeDto, MultipartFile[] multipartFiles) {
return storeService.addStoreInfo(storeDto,multipartFiles); } }
FeignClient代码如下
/** * FileName: FileService * Author: SixJR. * Date: 2022/3/2 18:38:56 * Description: 文件RPC服务接口 * History: * <author> <time> <version> <desc> */ @FeignClient(name = FeignServiceNameConstants.FILE_SERVICE, fallbackFactory = FileServiceFallbackFactory.class, decode404 = true) public interface FileService {
@PostMapping(value = "/enclosure/upload/{objectName}/{objectId}", produces = {
MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) Result upload(@PathVariable("objectName")String objectName, @PathVariable("objectId")String objectId,@RequestPart("multipartFiles") MultipartFile[] multipartFiles); }
Feign调用服务,传送类似MultipartFile[] multipartFiles多文件的时候,会出现如下错误
Could not write request: no suitable HttpMessageConverter found for request type [[Lorg.springframework.web.multipart.MultipartFile;] and content type [multipart/form-data]"
错误是因为Feign在组装MultipartFile[] multipartFiles多文件的时候出现了问题,解决这个问题可以重写SpringFormEncoder这个类,重写后的代码如下:
import feign.form.ContentType; import feign.form.MultipartFormContentProcessor; import feign.form.spring.SpringFormEncoder; import feign.RequestTemplate; import feign.codec.EncodeException; import feign.codec.Encoder; import feign.form.spring.SpringManyMultipartFilesWriter; import feign.form.spring.SpringSingleMultipartFileWriter; import org.springframework.web.multipart.MultipartFile; import java.lang.reflect.Type; import java.util.Collections; import java.util.Map; /** * FileName: SpringMultipartEncoder * Author: SixJR. * Date: 2022/3/2 19:54:12 * Description: Feign实现多文件上传,重写SpringFormEncoder * History: * <author> <time> <version> <desc> */ public class SpringMultipartEncoder extends SpringFormEncoder {
public SpringMultipartEncoder(Encoder delegate) {
super(delegate); MultipartFormContentProcessor processor = (MultipartFormContentProcessor) getContentProcessor(ContentType.MULTIPART); processor.addWriter(new SpringSingleMultipartFileWriter()); processor.addWriter(new SpringManyMultipartFilesWriter()); } @Override public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
if (bodyType != null && bodyType.equals(MultipartFile[].class)) {
MultipartFile[] file = (MultipartFile[]) object; if(file != null) {
Map data = Collections.singletonMap(file.length == 0 ? "" : file[0].getName(), object); super.encode(data, MAP_STRING_WILDCARD, template); return; } } super.encode(object, bodyType, template); } }
配置类如下
package com.chinared.common.config; import com.chinared.common.utils.SpringMultipartEncoder; 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 org.springframework.context.annotation.Configuration; /** * FileName: MultipartSupportConfig * Author: SixJR. * Date: 2022/3/2 19:56:43 * Description: 解决Feign在组装MultipartFile[]的时候出现的问题 * History: * <author> <time> <version> <desc> */ @Configuration public class MultipartSupportConfig {
@Autowired private ObjectFactory<HttpMessageConverters> messageConverters; @Bean public Encoder feignFormEncoder() {
return new SpringMultipartEncoder(new SpringEncoder(messageConverters)); } }
最后在FeignClient指定一下调用类就好啦~
package com.chinared.common.feign; import com.chinared.common.config.MultipartSupportConfig; import com.chinared.common.constant.FeignServiceNameConstants; import com.chinared.common.feign.fallback.FileServiceFallbackFactory; import com.chinared.common.model.Result; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; /** * FileName: FileService * Author: SixJR. * Date: 2022/3/2 18:38:56 * Description: 文件RPC服务接口 * History: * <author> <time> <version> <desc> */ @FeignClient(name = FeignServiceNameConstants.FILE_SERVICE, fallbackFactory = FileServiceFallbackFactory.class, decode404 = true,configuration = MultipartSupportConfig.class) public interface FileService {
@PostMapping(value = "/enclosure/upload/{objectName}/{objectId}", produces = {
MediaType.APPLICATION_JSON_UTF8_VALUE}, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) Result upload(@PathVariable("objectName")String objectName, @PathVariable("objectId")String objectId,@RequestPart("multipartFiles") MultipartFile[] multipartFiles); }
好啦,本篇关于OpenFeign支持多文件上传的解决方案就到这啦~
今天的文章
spring feign上传多个文件_大文件上传解决方案分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60254.html