写点什么

企业微信接入系列 - 上传临时素材

  • 2023-04-22
    北京
  • 本文字数:3471 字

    阅读完需:约 11 分钟

企业微信接入系列-上传临时素材

文档介绍

创建企业群发的文档地址:https://developer.work.weixin.qq.com/document/path/92135,在创建企业群发消息或者群发群消息接口中涉及到上传临时素材的操作,具体文档地址:https://developer.work.weixin.qq.com/document/path/90253,本文主要讲述的就是上传临时素材的操作。

上传临时素材

企业微信官方文档关于上传临时素材这一块的文档和上传附件资源的文档是一样的不是很清楚,这里鉴于上传插件太多的情况,我不针对于具体的一款上传插件举例,通俗化来说明

1.更改上传链接

就是说不管你是什么上传插件,在上传链接这里变更一下,同时注意接收上传方法返回的参数

uploadUrl: '/file/weChatMsgUpload', //上传的地址
复制代码

2.上传临时素材资源接口

https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE

临时素材接口参数说明


3.java 上传方法的具体调用逻辑如下

   /**     * 群发消息上传     * 群发消息上传成功后无法区分文件类型,故需要在上传成功后返回文件类型     */    @PostMapping("/file/weChatMsgUpload")    @ResponseBody    public AjaxResult weChatMsgUpload(MultipartFile file){        try        {            WeChatUploadAttachmentResponse res = weChatService.uploadMsg(file);            if (res != null) {                AjaxResult ajax = AjaxResult.success();                ajax.put("fileName", file.getOriginalFilename());                ajax.put("url", res.getType()+"@"+res.getMediaId());                return ajax;            }else {                return AjaxResult.error("上传失败!");            }        }        catch (Exception e)        {            return AjaxResult.error(e.getMessage());        }    }
复制代码

调用企业微信上传临时素材接口具体 java 实现的调用方法,其中关于代码的详细解释已经在代码文件中的注释中了,方便大家理解

 /**     * 上传临时素材--群发消息     * https://developer.work.weixin.qq.com/document/path/90253     *  素材上传得到media_id,该media_id仅三天内有效     *   media_id在同一企业内应用之间可以共享     * 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)     * @param file     * @return     */    @Override    public WeChatUploadAttachmentResponse uploadMsg(MultipartFile file) {        //获取accesstoken        String accessToken = getAccessToken();        if (StringUtils.isNotEmpty(accessToken)) {      //获取原始上传文件名称            String filename = file.getOriginalFilename();            //获取后缀 'jpg','JPG','png','PNG','mp4','MP4'            //,'amr','AMR','txt','pdf','PDF','xlx','xlxs','doc','docx'            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";            }else if ("amr".equals(substring) || "AMR".equals(substring)) {                mediaType = "voice";            }else {                mediaType = "file";            }      //上传临时素材接口地址            String url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token="+accessToken+                    "&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 即可,至此企业微信上传附件资源就算完成了。

最后

这里说一下这个企业微信上传临时素材接口,不是很清楚企业微信为什么相似的上传资源接口会提供两个,可能有特殊的考虑,但是上传临时素材接口整体操作和上传附件资源接口操作相似,只是官方文档接口地址不一样,这里是最后上传成功的版本,希望对大家有帮助,有问题的小伙伴也可以一起讨论哈。

发布于: 刚刚阅读数: 8
用户头像

让技术不再枯燥,让每一位技术人爱上技术 2022-07-22 加入

还未添加个人简介

评论

发布
暂无评论
企业微信接入系列-上传临时素材_企业微信_六月的雨在InfoQ_InfoQ写作社区