当前位置: 首页 > 知识库问答 >
问题:

使用RestTemplate上载MultipartFiles

刘俊语
2023-03-14

我有两个endpoint。一个endpoint将从Postman接收文件,并应使用< code>RestTemplate将相同的文件预先发送给另一个endpoint。

正在调用第二个终结点,但没有文件。

@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";
    }
@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个答案

储臻
2023-03-14

根据所知,您可以使用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();
}

我还没有尝试将文件转发到另一个endpoint,但成功地完成了字符串。希望上述方法有助于解决这个问题。有关文件Java文档的更多信息

公冶高义
2023-03-14

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

    @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);
    }
   @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;
    }
 类似资料:
  • 我正在发送API和接收状态代码400与我需要解析的正文 在使用RestTemplate时,我无法解析响应: 在这种情况下,我怎么还能得到正文/标题?我必须使用RestTemplate的替代方案吗? 此外,当我在内遇到捕获异常时,如何返回到请求上下文:

  • 我试图使用来生成。出于某种原因,我无法重现我使用创建的,该代码可以毫无问题地运行。 下面是我的调用成功并返回200:

  • 有没有办法在Java-Spring框架中使用rest模板将文件上传到Azure blob存储?我看到了所有使用SDK的例子,它是成功的,但我们被告知不要使用SDK-Java。我知道这个问题有10000英尺高,但任何指针/方向都会有很大帮助。

  • 问题内容: 我正在使用URL类从中读取InputStream。有什么我可以使用RestTemplate的方法吗? 我怎样才能 用,而不是使用? 问题答案: 您不应该直接获得。旨在封装处理响应(和请求)内容。它的优势在于处理所有IO,并为您提供现成的Java对象。 的一位原始作者Brian Clozel 表示: 并不意味着流响应主体;它的合同不允许这样做,而且已经存在了很长时间,以至于在不中断许多应

  • 这就是我如何尝试使用RestTemplate调用服务器, 这就是我如何使用它(用于测试) 我的登录响应类及其子类, null null null null 公共类BaseResponse{ 受保护字符串StatusCode; 我的问题是,1。为什么调用服务器时会出现此错误 信息:org.springframework.beans.factory.support.defaultListableBea

  • 我试图通过exchange方法用Spring RestTemplate做一个带有主体的HTTP删除请求,但我总是收到一个400个错误的请求,就像这个问题一样。使用JavaScript和其他工具,可以使用delete调用这个API。我知道java<1.8确实支持DELETE with body,但在1.8中应该可以:参见此处。我使用的是带有jdk 1.8的Spring-Web-4.2.6.Relea