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

简介: 简述在API接口创建企业群发时上传临时素材的操作

文档介绍

创建企业群发的文档地址: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

参数说明

image.png3.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());
        }
    }

企业微信上传临时素材接口调用方法

    /**
     * 上传临时素材--群发消息
     * 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即可,至此企业微信上传附件资源就算完成了。

最后

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

相关文章
C#-微信公众平台接口-上传临时素材
最烦做微信公众平台的东西。。文档说得不清不楚,又没示例代码,只能自己 慢慢搜索,弄了一晚上,基本弄出来了,把本地的图片上传到微信的临时素材那里,返回媒体ID,用于其他操作,代码如下 :(自己导入相应的类System.
1640 1
|
5月前
|
PHP
php使用curl新增微信临时素材(上传图片)
php使用curl新增微信临时素材(上传图片)
252 4
|
4月前
|
小程序 JavaScript 前端开发
【微信小程序-原生开发】实用教程06-轮播图、分类页签 tab 、成员列表(含Tdesign升级,切换调试基础库,设置全局样式,配置组件按需注入,添加图片素材,wx:for,生命周期 onLoad)
【微信小程序-原生开发】实用教程06-轮播图、分类页签 tab 、成员列表(含Tdesign升级,切换调试基础库,设置全局样式,配置组件按需注入,添加图片素材,wx:for,生命周期 onLoad)
144 0
|
5月前
|
Java
微信公众号素材下载之java
微信公众号素材下载之java
|
人工智能 小程序 数据安全/隐私保护
微信8.0状态视频无水印素材+个人设置技巧
微信8.0状态视频无水印素材+个人设置技巧
312 0
微信8.0状态视频无水印素材+个人设置技巧
微信公众号获取token,上传素材
微信公众号获取token,上传素材
153 0
|
JSON 前端开发 Java
Java微信公众平台开发_06_素材管理
一、本节要点 1.官方文档的media  这个media可以理解为文件,即我们需要以POST方式提交一个文件     2.媒体文件有效期 媒体文件在微信后台保存时间为3天,即3天后media_id失效。
1298 0
|
移动开发 Java
Java企业微信开发_08_素材管理之下载微信临时素材到本地服务器
一、本节要点 1.获取临时素材接口 请求方式:GET(HTTPS) 请求地址:https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID 2.获取临时素材接口的返回结果 企业微信官方开发文档中说明的返回结果如下: 若你以为这就是返回结果,然后跟之前一样,先访问接口,从http连接的输入流中的获取回结果的文本内容,你会发现你接收到的结果是一堆乱码。
1813 0
|
JSON 缓存 移动开发
Java企业微信开发_06_素材管理之上传本地临时素材文件至微信服务器
一、本节要点 1.临时素材有效期 media_id是可复用的,同一个media_id可用于消息的多次发送(3天内有效)   2.上传文件时的http请求里都有啥   具体原理可参看: 为什么上传文件的表单需要设置enctype="multipart/form-data" (http://blog.
1582 0