给企业微信上传素材时发现微信素材的包体真是复杂,以前还没遇到过,可能是之前的接口都比较简单吧。开始试着上传了几次都是报包体缺失,后面上传上去了,单没法重命名文件名。最終解決,测试代码如下,留着以后备用。
@PostMapping("/up/3")
public String v3(MultipartFile file) throws IOException {
String chaceUrl = StrUtil.format("https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}","B9u5cRWhJ2nRPzc2Ts0tYKAAXGxZH8gxJD3RYHtkFvGgos3GQER--mb7vrZAlQ0k7g292lM8Pj67Qzz48djv05KMrlbvN0rRCTR4uy4HyLFtQAtNj7pfgqylzrygUcQSUYJDUOCWtB7u-W8xkauTvWLs6Py3vRmDBUd-k-juo__jwfX_UUo1nL0yfcQhsbHp9vgxUJC5eX4vdg6im7uvCw");
//微信报文
//POST https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=accesstoken001&type=file HTTP/1.1
//Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
//Content-Length: 220
//
//---------------------------acebdf13572468
//Content-Disposition: form-data; name="media";filename="wework.txt"; filelength=6
//Content-Type: application/octet-stream
//
//mytext
//---------------------------acebdf13572468--
//构造请求头
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
//构建下面的请求体
HttpHeaders pictureHeader = new HttpHeaders();
//这里根据文件类型设置, 普通文件就是 APPLICATION_OCTET_STREAM , 图片就用IMAGE_PNG
pictureHeader.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//设置文件名称 经测试不要加后缀
pictureHeader.setContentDispositionFormData("file","展示的文件名");
ByteArrayResource bar = new ByteArrayResource(file.getBytes());
HttpEntity<ByteArrayResource> picturePart = new HttpEntity<>(bar, pictureHeader);
//组成body
MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();
multipartRequest.add("file", picturePart);
//这里的file 代表的是临时素材url参数 &type = XXX ,根据上传的文件类型设置, 企业微信共有4中素材类型 图片,音频 视频,普通文件
//需要注意的是 这里要和pictureHeader这个请求头里的类型一致,如:IMAGE_PNG ,则这里就是image 否则获取素材时会出错。
multipartRequest.add("type", "file");
//放body 和 head
HttpEntity entity = new HttpEntity(multipartRequest, headers);
//请求微信
ResponseEntity<String> responseEntity = restTemplate.postForEntity(chaceUrl,entity,String.class);
System.out.println(responseEntity.getBody());
return responseEntity.getBody();
// return null;
}