Feign实现多文件上传,Open Feign多文件上传问题及解决
作者:By子诺
这篇文章主要介绍了Feign实现多文件上传,Open Feign多文件上传问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
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支持多文件上传的解决方案就到这啦~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。