文档介绍
企业发表内容到客户的朋友圈的文档地址:https://developer.work.weixin.qq.com/document/path/93506,在企业发表内容到客户朋友圈的接口中涉及到上传附件资源的操作,具体文档地址:https://developer.work.weixin.qq.com/document/path/95098,本文主要讲述的就是上传附件资源的操作。
上传附件资源
企业微信官方文档关于上传附件资源这一块写的不是很清楚,这里鉴于上传插件太多的情况,我不针对于具体的一款上传插件举例,通俗化来说明
1.更改上传链接
就是说不管你是什么上传插件,在上传链接这里变更一下,同时注意接收上传方法返回的参数
uploadUrl: '/file/weChatUpload', //上传的地址
复制代码
2.上传附件资源接口
https://qyapi.weixin.qq.com/cgi-bin/media/upload_attachment?access_token=ACCESS_TOKEN&media_type=TYPE&attachment_type=1
企业微信文档中的参数说明
3.java 上传方法,主要实现企业微信上传附件的调用
/**
* 朋友圈图片或者视频上传
*/
@PostMapping("/file/weChatUpload")
@ResponseBody
public AjaxResult weChatUpload(MultipartFile file){
try
{
WeChatUploadAttachmentResponse res = weChatService.uploadAttachment(file);
if (res != null) {
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", file.getOriginalFilename());
ajax.put("url", res.getMediaId());
return ajax;
}else {
return AjaxResult.error("上传失败!");
}
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
}
复制代码
企业微信接口调用方法,详细实现调用企业微信接口上传附件到企业微信,同时返回企业微信可识别的资源编码
/**
* 上传附件资源--朋友圈
* https://developer.work.weixin.qq.com/document/path/95098
* 素材上传得到media_id,该media_id仅三天内有效
* media_id在同一企业内应用之间可以共享
* 朋友圈附件类型,仅支持图片与视频
* @param file
* @return
*/
@Override
public WeChatUploadAttachmentResponse uploadAttachment(MultipartFile file) {
//获取accesstoken
String accessToken = getAccessToken();
if (StringUtils.isNotEmpty(accessToken)) {
String filename = file.getOriginalFilename();
//获取上传文件后缀
int i = filename.lastIndexOf(".");
String substring = filename.substring(i + 1);
String mediaType = "";
if ("jpg".equals(substring) || "JPG".equals(substring) || "png".equals(substring) || "PNG".equals(substring)) {
mediaType = "image";
}else if ("mp4".equals(substring) || "MP4".equals(substring)) {
mediaType = "video";
}
//上传附件资源接口连接
String url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload_attachment?access_token="+accessToken+
"&attachment_type=1&media_type="+mediaType;
//添加请求头信息
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
File file1 = null;
try {
//获取上传附件大小
int length = file.getBytes().length;
headers.setContentLength(length);
//设置请求包 Content-Disposition form-data中媒体文件标识
ContentDisposition contentDisposition =
ContentDisposition.builder("form-data").filename(filename).name("media").build();
headers.setContentDisposition(contentDisposition);
//MultipartFile 转 File
file1 = toFile(file);
//获取FileSystemResource
FileSystemResource resource = new FileSystemResource(file1);
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
params.add("media", resource);
//设置请求包
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(params, headers);
//post调用企业微信上传附件资源接口
ResponseEntity<String> post = RestUtils.post(url,requestEntity,String.class);
if (Objects.nonNull(post)) {
//获取接口返回值
String body = post.getBody();
WeChatUploadAttachmentResponse res = JSON.parseObject(body, WeChatUploadAttachmentResponse.class);
return res;
}
}catch (Exception e) {
e.printStackTrace();
}finally {
if (file1 != null) {
file1.delete();
}
}
}
return null;
}
//MultipartFile 转 File
private File toFile(MultipartFile multipartFile) {
//文件上传前的名称
String fileName = multipartFile.getOriginalFilename();
File file = new File(fileName);
OutputStream out = null;
try{
//获取文件流,以文件流的方式输出到新文件
out = new FileOutputStream(file);
byte[] ss = multipartFile.getBytes();
for(int i = 0; i < ss.length; i++){
out.write(ss[i]);
}
return file;
}catch(IOException e){
e.printStackTrace();
return null;
}finally {
if (out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
复制代码
返回值对象代码,主要是用于接收企业微信上传接口返回值对象,
public class WeChatUploadAttachmentResponse extends WeChatResponse{
private static final long serialVersionUID = -6462589895169294923L;
@ApiField("type")
private String type;
@ApiField("media_id")
private String mediaId;
@ApiField("created_at")
private Long createdAt;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getMediaId() {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
public Long getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Long createdAt) {
this.createdAt = createdAt;
}
}
复制代码
上传插件通过页面返回值取出对应的 media_id 即可,至此企业微信上传附件资源就算完成了。
最后
这里说一下这个上传附件资源,由于企业微信接口文档写的太模糊,因此初次看企业微信上传接口文档的时候会比较懵,另外文档写的个人觉得也有点乱,又没有在线可调试按钮,文档中也没有上传附件调用接口的 demo 代码,所以在开发时通过阅读官方文档理解关于上传附件资源这块比较费劲,我这里是最后上传成功的版本,希望对大家有帮助,有问题的小伙伴也可以一起讨论哈。
评论