Как передать файл Multipart из одного сервиса в другой при весенней загрузке? - PullRequest
1 голос
/ 07 января 2020

Я хотел бы передать многокомпонентный файл от одной службы к другой.

Клиент -> Служба1 -> Служба2

Это показывает ошибку «500 внутренняя ошибка сервера, текущий запрос не составной запрос ", когда я передаю файл из Service1 в Service2

Client -> Service2, когда я отправляю файл напрямую, он работает, но не через Service1

I хочу знать, в чем может быть причина, я думаю, я пропускаю некоторые части заголовка при передаче файла из нескольких частей в качестве параметра.

Service2

@PostMapping(path="/upload")
public ResponseEntity<Properties> upload(@RequestParam("file") MultipartFile multiPart) {
    return saveFile(multiPart);
}

Service2-клиент

@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);
        }
    }
}

Service1

@Autowired
UploadServiceClient uploadSvcClient;
@PostMapping(path="/upload")
public ResponseEntity<Properties> uploadAttachment(@RequestParam("file") MultipartFile file) {
    return uploadSvcClient.upload(file);
}

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Наконец-то удалось решить проблему связи с другим сервисом, используя сообщение Загрузка файла. Spring cloud feign client

Я изменил тип параметра FeignClient с

@ RequestParam ("файл") MultipartFile mFile

до

@ RequestPart ("файл") Файл 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);

Реализация Service1

@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.
    }
0 голосов
/ 09 января 2020

Возможно, вам нужен заголовок, указывающий, что ваш запрос состоит из нескольких частей. этот ответ решает вашу проблему? Требуется аннотация заголовка:

@PostMapping(path="/upload")
@Headers("Content-Type: multipart/form-data")
ResponseEntity<Properties> upload(@Param("file") MultipartFile multiPart);

Это только предположение. Пожалуйста, попробуйте и дайте мне знать результат.

...