在Spring Boot中,使用RestTemplate发送文件通常涉及构建一个多部分(multipart)请求。以下是一个使用RestTemplate将接受到的文件转发给其它服务的示例:
Java
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.util.Map;
import org.springframework.web.multipart.MultipartFile;
public class FileUploader {
private final RestTemplate restTemplate;
public FileUploader(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
/**
**file为接受到的文件
**/
public ResponseEntity<String> uploadFile(String remoteUrl, MultipartFile file) throws Exception{
String fileName = file.getOriginalFilename();
//MultipartFile 转换为 File
File fileToUpload= new File(FileUtils.getTempDirectoryPath() + File.separator+ fileName);
FileUtils.copyInputStreamToFile(file.getInputStream(), fileToUpload);
// 创建HTTP头部,设置为多部分表单类型
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
// 创建多值映射以存储表单数据
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
// 将要上传的文件包装成一个Resource对象
FileSystemResource resource = new FileSystemResource(fileToUpload);
// 添加文件到body中,key通常是目标服务接收文件的字段名
body.add("file", resource );
// 如果有其他表单字段,可以这样添加
// body.add("otherField", "fieldValue");
// 创建包含body和headers的HttpEntity
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
// 使用RestTemplate发送POST请求
ResponseEntity<String> response = restTemplate.postForEntity(remoteUrl, requestEntity, String.class);
//删除临时文件
fileToUpload.delete();
return response;
}
}
在上面例子中,我们首先创建了一个HttpHeaders对象,并设置了Content-Type为multipart/form-data。然后,我们创建了一个LinkedMultiValueMap来存储表单数据,将要上传的文件作为FileSystemResource添加到map中。最后,我们将这个map封装进HttpEntity并用RestTemplate发送POST请求。
请注意,你需要根据目标服务的API文档调整请求URL、表单字段名以及请求头的内容。同时,确保已正确处理文件路径和文件存在性检查。另外,从Spring 5开始推荐使用WebClient替代RestTemplate进行HTTP通信,因为它提供了更强大的异步和响应式功能。