场景:

最近在项目中遇到了一个问题,项目本来使用SpringBoot开发,要写一个接口提供给前端,而我们的接口拿到前端的文件后,向另一个SpringBoot项目的服务发送文件(注:发送的文件类型为MultipartFile)。
在这里插入图片描述

解决方案:

先设置请求头,这个很简单,直接用HttpHeaders类即可:

//封装请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE + ";charset=UTF-8");
httpHeaders.set("test1", "1");
httpHeaders.set("test2", "2");

首先,我们拿到文件后,为了发送请求到另一个服务器,则把MultipartFile类型的文件转换成Java的File类型。
转换完后将File对象转成FileSystemResource。

//文件处理
FileSystemResource resource = new FileSystemResource(multipartFile2File(file));

转换器

private static File multipartFile2File(@NonNull MultipartFile multipartFile) {
    // 获取文件名
    String fileName = multipartFile.getOriginalFilename();
    // 获取文件前缀
    String prefix = fileName.substring(0, fileName.lastIndexOf("."));
    //获取文件后缀
    String suffix = fileName.substring(fileName.lastIndexOf("."));
    try {
    	//生成临时文件
        File file = File.createTempFile(prefix, suffix);
        //将原文件转换成新建的临时文件
        multipartFile.transferTo(file);
        file.deleteOnExit();
        return file;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;

}

其次,使用MultiValueMap实例化一个LinkedMultiValueMap,当作post请求的请求体里multipart/form-data类型的数据
MultiValueMap可以为请求体的multipart/form-data载体
然后将一些参数和已经转换好后的文件放在这个MultiValueMap中:

//表单处理
MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("FileList", resource);
form.add("Type", "type");
//其他multipart/form-data数据
form.add("test", "test");

准备好这些数据以后,使用org.springframework.http包下的HttpEntity封装请求体:

HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, httpHeaders);

最终使用restTemplate实例的postForObject方法直接发送请求即可:

RestTemplate restTemplate = new RestTemplate();
//发送请求,:目标服务器接口地址、请求体、返回类型(可自定义,我这里是使用的Result类)
Result<?> result = restTemplate.postForObject(url, files, Result.class);

拿到请求结果后即可进行后续的处理了。

完整的代码块:

try {

	String url="服务器2中接口的地址";
    //封装请求头
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.set("Content-Type", MediaType.MULTIPART_FORM_DATA_VALUE + ";charset=UTF-8");
    httpHeaders.set("test1", "1");
    httpHeaders.set("test2", "2");

    //文件处理
    FileSystemResource resource = new FileSystemResource(multipartFile2File(file));

    //表单处理
    MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
    form.add("FileList", resource);
    form.add("Type", "type");
    form.add("test", "test");

    HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, httpHeaders);

    RestTemplate restTemplate = new RestTemplate();
    //发送请求
    Result<?> result = restTemplate.postForObject(url, files, Result.class);

    if (result.isSuccess()) {
        //后续处理
        return Result.OK();
    }
    return Result.error(result.getMessage());
} catch(Exception e){
     e.printStackTrace();
 }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐