RestTemplate方式请求发送multipart-form-data混合数据(包括多个文件和json字符串等)

前言:

日常我们使用http发送请求到其他服务器接口的时候,一般都是发送json格式的数据,或是json串、或是key-value值,格式是 application/json。但也可能遇到需要同时发送多个文件以及其他类型参数的混合数据,这时候,我们使用的http的contentType就是 multipart/form-data。针对这一需求,我们有多种方式实现:1借助spring自身的RestTemplate实现;2借助httpClient实现;

环境:

spring 4.3.0以上(4.3之前版本会出现中文乱码的情况)

org.springframework.http

实现:

发送端:

public static void main(String[] args) {
    List<String> filePaths = new ArrayList<>();
    filePaths.add("E:\\test\\picture\\大.png");
    filePaths.add("E:\\test\\picture\\2.png");
    sendMultiFormData("http://localhost:8080/receive", filePaths, "测试多文件数据中文乱码");
}

public static void sendMultiFormData(String url, List<String> filePaths, String data) {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.MULTIPART_FORM_DATA);
    MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
    for (String filePath : filePaths) {
        FileSystemResource fileSystemResource = new FileSystemResource(filePath);
        if (!fileSystemResource.exists()) {
            continue;
        } else {
            form.add("file", fileSystemResource);
        }
    }
    form.add("data", data);
    RestTemplate restTemplate = new RestTemplate();
    HttpEntity<MultiValueMap<String, Object>> datas = new HttpEntity<>(form, headers);
    ResponseEntity<Object> responseEntity = restTemplate.postForEntity(url, datas, Object.class);
    String result = responseEntity.getBody().toString();
    System.out.println(result.toString());
}

 

接收端:

@PostMapping(value = "/receive")
public Object testUploading(@RequestParam("file") MultipartFile[] files , String data) {
    String filepath = "E:\\test\\save\\";
    File targetFile = new File(filepath);
    if (!targetFile.exists()) {
        targetFile.mkdirs();
    }
    List<String> dp = new ArrayList<>() ;
    for(int i = 0 ; i < files.length ; i++){
        MultipartFile file = files[i] ;
        try {
            FileOutputStream out = new FileOutputStream(filepath + file.getOriginalFilename());
            out.write(file.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return "SUCCESS";
}

总结:

1、使用multipart/form-data方式发送混合数据;

2、spring4.3之前会出现中文乱码的问题,因为spring源码默认的就是iso的编码格式(具体可以自己看或者网上搜相关资料),解决的办法也有:升级spring或者把服务端的接收参数类型都改为string,然后通过设置utf-8编码格式(但是这些方式都不符合我的需求)

3、我实际的解决方式是文件和字符串数据分开成两个接口上传(spring无法升级),或者用其他方式实现比如httpClient等(下一篇文章介绍)。

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值