如何在 spring 启动时将多部分文件从一个服务传递到另一个服务?
How to pass Multipart file from one service to another service in spring boot?
我想将多部分文件从一项服务传递到另一项服务。
客户端 --> 服务 1 --> 服务 2
这显示错误“500 内部服务器错误,当前请求不是多部分请求”当我将文件从 Service1 传递到 Service2
客户端 --> Service2 当我直接发送文件时它的工作而不是通过 Service1
我想知道可能是什么原因,我想我在将多部分文件作为参数传递时缺少一些 header 部分。
服务2
@PostMapping(path="/upload")
public ResponseEntity<Properties> upload(@RequestParam("file") MultipartFile multiPart) {
return saveFile(multiPart);
}
Service2-client
@FeignClient
(name="${feign.upload.serverId}", configuration = UploadServiceClientConfiguration.class, decode404 = true)
public interface UploadServiceClient {
@PostMapping(path="/upload")
ResponseEntity<Properties> upload(@RequestParam("file") MultipartFile multiPart);
class UploadServiceClientConfiguration {
@Value(value="${feign.upload.user}")
String user;
@Value(value="${feign.upload.password}")
String password;
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor(user, password);
}
}
}
服务 1
@Autowired
UploadServiceClient uploadSvcClient;
@PostMapping(path="/upload")
public ResponseEntity<Properties> uploadAttachment(@RequestParam("file") MultipartFile file) {
return uploadSvcClient.upload(file);
}
也许您需要一个 header 来表明您的请求是多部分的。
this answer 是否解决了您的问题?
需要的是 header 注释:
@PostMapping(path="/upload")
@Headers("Content-Type: multipart/form-data")
ResponseEntity<Properties> upload(@Param("file") MultipartFile multiPart);
这只是一个假设。请试一试,让我知道结果。
终于能够使用 post
解决与另一个服务的通信问题
我已经从
更改了 FeignClient 参数类型
@RequestParam("file") MultipartFile mFile
到
@RequestPart("file") MultiValueMap 文件。
FeignClient签名
@PostMapping(value="/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity<Properties> upload(@RequestHeader(name=UID,required=false) String uid, @RequestPart("file") MultiValueMap<String, Object> file);
服务 1 实施
@PostMapping(path="/upload")
public ResponseEntity<Properties> uploadAttachment(@RequestHeader(IRSConsts.UID) String uid, @RequestParam("file") MultipartFile mFile) {
MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
ByteArrayResource contentsAsResource = null;
try {
contentsAsResource = new ByteArrayResource(mFile.getBytes()) {
@Override
public String getFilename() {
return mFile.getOriginalFilename();
}
};
} catch (IOException e) {
e.printStackTrace();
}
multiValueMap.add("file", contentsAsResource);
return transSvcClient.upload(uid, multiValueMap);
}
Service2 实施
@PostMapping(path = "/upload")
@Headers("Content-Type: multipart/form-data")
public ResponseEntity<Properties> upload(@RequestHeader(name = UID, required = false) String uid,
@RequestPart("file") MultipartFile multiPart) {
//Save Attachment.
}
我想将多部分文件从一项服务传递到另一项服务。
客户端 --> 服务 1 --> 服务 2
这显示错误“500 内部服务器错误,当前请求不是多部分请求”当我将文件从 Service1 传递到 Service2
客户端 --> Service2 当我直接发送文件时它的工作而不是通过 Service1
我想知道可能是什么原因,我想我在将多部分文件作为参数传递时缺少一些 header 部分。
服务2
@PostMapping(path="/upload")
public ResponseEntity<Properties> upload(@RequestParam("file") MultipartFile multiPart) {
return saveFile(multiPart);
}
Service2-client
@FeignClient
(name="${feign.upload.serverId}", configuration = UploadServiceClientConfiguration.class, decode404 = true)
public interface UploadServiceClient {
@PostMapping(path="/upload")
ResponseEntity<Properties> upload(@RequestParam("file") MultipartFile multiPart);
class UploadServiceClientConfiguration {
@Value(value="${feign.upload.user}")
String user;
@Value(value="${feign.upload.password}")
String password;
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor(user, password);
}
}
}
服务 1
@Autowired
UploadServiceClient uploadSvcClient;
@PostMapping(path="/upload")
public ResponseEntity<Properties> uploadAttachment(@RequestParam("file") MultipartFile file) {
return uploadSvcClient.upload(file);
}
也许您需要一个 header 来表明您的请求是多部分的。 this answer 是否解决了您的问题? 需要的是 header 注释:
@PostMapping(path="/upload")
@Headers("Content-Type: multipart/form-data")
ResponseEntity<Properties> upload(@Param("file") MultipartFile multiPart);
这只是一个假设。请试一试,让我知道结果。
终于能够使用 post
我已经从
更改了 FeignClient 参数类型@RequestParam("file") MultipartFile mFile
到
@RequestPart("file") MultiValueMap 文件。
FeignClient签名
@PostMapping(value="/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity<Properties> upload(@RequestHeader(name=UID,required=false) String uid, @RequestPart("file") MultiValueMap<String, Object> file);
服务 1 实施
@PostMapping(path="/upload")
public ResponseEntity<Properties> uploadAttachment(@RequestHeader(IRSConsts.UID) String uid, @RequestParam("file") MultipartFile mFile) {
MultiValueMap<String, Object> multiValueMap = new LinkedMultiValueMap<>();
ByteArrayResource contentsAsResource = null;
try {
contentsAsResource = new ByteArrayResource(mFile.getBytes()) {
@Override
public String getFilename() {
return mFile.getOriginalFilename();
}
};
} catch (IOException e) {
e.printStackTrace();
}
multiValueMap.add("file", contentsAsResource);
return transSvcClient.upload(uid, multiValueMap);
}
Service2 实施
@PostMapping(path = "/upload")
@Headers("Content-Type: multipart/form-data")
public ResponseEntity<Properties> upload(@RequestHeader(name = UID, required = false) String uid,
@RequestPart("file") MultipartFile multiPart) {
//Save Attachment.
}