Загрузить MultipartFiles, используя RestTemplate - PullRequest
0 голосов
/ 11 октября 2019

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

2-ая конечная точка вызывается, но нет файлов.

конечная точка 1:

@PostMapping("/upload/test")
    public String testUpload(@RequestParam("files") List<MultipartFile> files) throws IOException{

        if (files.isEmpty()) {          
            return "Please select a file . . .";
        }
        System.out.println("**** Number of files : "+files.size());



        MultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
        List<Object> f = new ArrayList<>();
        for(MultipartFile file : files) {
            f.add(new ByteArrayResource(file.getBytes()));
        }
        map.put("files", f);


        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(map, headers);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.exchange("http://localhost:8085/upload/test/client",
                HttpMethod.POST, requestEntity, String.class);
        System.out.println("response status: " + response.getStatusCode());
        System.out.println("response body: " + response.getBody());


        return "success";
    }

конечная точка 2:

@PostMapping("/upload/test/client")
    public String testClient(@RequestParam("files") List<MultipartFile> files){
        System.out.println("********inside client  *****************");
        System.out.println(files);
        return "200";
    }

O / P:

**** Number of files : 2
********inside client  *****************
[]
response status: 200 OK
response body: 200

Ответы [ 2 ]

1 голос
/ 14 октября 2019

Я решил вопросы следующим образом и также работает с несколькими файлами.

Конечная точка 1

    @PostMapping("/upload")
    public ResponseEntity testUpload(@RequestParam("file") List<MultipartFile> file) throws IOException{
        System.out.println("********received file:"+file.size());
        String serverUrl = "http://localhost:8080/upload/client";

        MultiValueMap<String, Object> body =getMultivalueMap(file);

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, Object>> requestEntity= new HttpEntity<>(body, headers);

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response = restTemplate.postForEntity(serverUrl, requestEntity, String.class);
        System.out.println(response);

        return new ResponseEntity<>(HttpStatus.OK);
    }

Конечная точка 2

   @PostMapping("/upload/client")
    public ResponseEntity testClient(@RequestParam("file") List<MultipartFile> file){

        System.out.println("********client file:"+file.size());
        file.forEach(f->{
            System.out.println("### Client File Name :"+f.getOriginalFilename());           
        });
        return new ResponseEntity<>(HttpStatus.OK);
    }

Содержимое тела

private MultiValueMap<String, Object> getMultivalueMap(List<MultipartFile> files) throws IOException {
        MultiValueMap<String, Object> map = new LinkedMultiValueMap<String, Object>();
        for(MultipartFile file : files) {
            ByteArrayResource contentsAsResource = new ByteArrayResource(file.getBytes()){
                @Override
                public String getFilename(){
                    return file.getOriginalFilename();
                }
            };
            map.add("file", contentsAsResource);
        }
        return map;
    }
0 голосов
/ 12 октября 2019

Исходя из знаний, вы можете создать временный файл с помощью File f=File.createTempFile() и удалить его после успешной транзакции с помощью f.deleteOnExit().

File tempFile = null;
try {
    String extension = "." + FilenameUtils.getExtension(file.getOriginalFilename()); // from apachi common io
    tempFile = File.createTempFile("temp", extension); // can pass the directory also as a third parameter
    file.transferTo(tempFile);
} catch (IOException e) {
    e.printStackTrace();
}

Я не пытался переслать файл на другую конечную точку,но успешно сделано для строк. Надеемся, что вышеуказанный метод должен помочь преодолеть проблему. Для получения дополнительной информации о файле Java Doc

...