restTemplate.postForEntity()携带文件请求时2.x正常返回 3.x时提示Error writing request body to server

 public String uploadFile(@RequestParam(value = "audio")MultipartFile audio){
        // 创建RestTemplate实例
        RestTemplate restTemplate = new RestTemplate();
        File file = multipartFileToFile(audio);
        // 目标URL
        String url = "http://192.168.6.174:8000/asr/trans";
        // 创建MultiValueMap来存储文件和其他参数
        MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
        // 添加文件
        FileSystemResource files = new FileSystemResource(file);
        body.add("audio", files);
        // 如果需要添加其他参数
        body.add("language", "zh");
        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        // 创建HttpEntity
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
        // 发送请求
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, String.class);
        log.debug("responseEntity.getBody:{}", responseEntity.getBody());
        // 处理响应
        String mergeTexts = "";
        responseEntity.getBody();
        if (!responseEntity.getBody().isEmpty()) {
            mergeTexts = mergeTexts(responseEntity.getBody());
        }
        return mergeTexts;
    }

在使用SpringBoot2.5.15时正常返回,最近升级SpringBoot3.3.4,对这个功能点进行测试时报错了,有了解的大佬吗?

异常信息是什么。

16:39:41.498 [http-nio-80-exec-4] ERROR c.r.f.w.e.GlobalExceptionHandler - [handleRuntimeException,70] - 请求地址’/system/user/stopRecord’,发生未知异常.
org.springframework.web.client.ResourceAccessException: I/O error on POST request for “http://192.168.6.174:8000/asr/trans”: Error writing request body to server

从这个信息来看,应该是读取本地磁盘文件发生了异常。

你可以在控制台输出异常堆栈信息,这样可以知道异常的详细情况。

这段代码在使用SPringBoot2.5.15时,是正常返回的,文件内容未更换

使用OkHttpClient可解决该问题,怀疑在SpringBoot3.x当中使用上面方式请求时,可能是底层代码未处理完全。

restTemplate 请求方式底层使用的是web client,断点进去看了下,有几处是null,项目等着上线,暂时先这样,有时间再去仔细研究

1 Like

同时感谢@KevinBlandy 的帮助