使用 RestTemplate 上传 MultipartFiles
Upload MultipartFiles using RestTemplate
我有两个终点。一个端点将从 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
据了解,您可以使用 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
的更多信息
我解决了如下问题,并且也在处理多个文件。
端点 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;
}
我有两个终点。一个端点将从 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
据了解,您可以使用 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
的更多信息我解决了如下问题,并且也在处理多个文件。
端点 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;
}