【问题标题】:Upload MultipartFiles using RestTemplate使用 RestTemplate 上传 MultipartFiles
【发布时间】:2019-10-11 15:05:20
【问题描述】:

我有两个端点。一个端点将从 Postman 接收文件,并应使用 RestTemplate 将相同的文件转发到另一个端点。

第二个端点被调用,但没有文件。

端点 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

【问题讨论】:

标签: spring-boot resttemplate


【解决方案1】:

我解决了以下问题,并且正在处理多个文件。

端点 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;
    }

【讨论】:

    【解决方案2】:

    据了解,您可以使用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

    【讨论】:

    • 我根本不想创建临时文件。对于字符串,这很好。但我需要通过另一个终点
    • @DEBENDRADHINDA varman 建议的上述方法是正确的。我已经这样做了。当您将端点转发到端点时,第二个端点需要字符串(根据我的经验)。所以存储一个临时文件并删除是解决这个问题的方法
    • @Nishakar 那么我可以将第二个端点的有效负载作为字符串类型吗?
    • 我没有尝试将其作为Base64 的字节数组发送到第二个端点。不过你可以通过UrlComponentBuilder试试
    • varman,我已经手动创建并删除了文件,非常感谢,它的工作正常,代码更少。 @DEBENDRADHINDA 完成后,请在没有太多答案的情况下提供有用的答案
    猜你喜欢
    • 2015-07-26
    • 2018-09-19
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2020-03-18
    • 2021-09-18
    相关资源
    最近更新 更多