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

news2024/11/17 15:05:15

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

  • 文档介绍
  • 上传临时素材
  • 写在最后

文档介绍

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

        }

    }

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

 /**

     * 上传临时素材--群发消息

     * 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即可,至此企业微信上传附件资源就算完成了。

写在最后

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1721193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【二进制部署k8s-1.29.4】七、验证master的安装

文章目录 简介 一.确认kubectl命令是否正常运行二.确认etcd安装是否正常运行三.确认kube-apiserver,kube-controller-manager,kube-scheduler安装是否正常四.配置apiserver和kubelet的访问授权五.master端安装脚本4.1.安装master端所需文件4.2.master快捷安装脚本 简介 本章节主…

北邮22级信通院DSP:IIR_DF系统3.0版:从H(p)到H(s):一种更为严谨精确的运算模式

北邮22信通一枚~ 跟随课程进度更新北邮信通院DSP的笔记、代码和文章&#xff0c;欢迎关注~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院DSP_青山入墨雨如画的博客-CSDN博客 承接上一篇博客 北邮22级信通院DSP&#xff1a;IIR_DF系统2.0版&#xff1a;…

深入pandas:数据分析

目录 前言 第一点&#xff1a;导入模块 第二点&#xff1a;准备数据 第三点&#xff1a;简单的分析数据 第四点&#xff1a;【重点】数据透支 总结 前言 在数据分析与挖掘的领域&#xff0c;了解如何使用工具和方法来探索数据是至关重要的。本文将探讨如何利用Python中的…

洛谷P1035 级数求和 题解

#题外话&#xff08;第42篇题解&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P1035#思路 没啥思路&#xff0c;这其实偏向模拟一点&#xff0c;按照题目说的做就行了。 #代码 原来是这个熊样的&#xff08;都能AC&#xff0c;优化的问题&#xff09; …

营造科技展厅主题氛围,多媒体应用有哪些新策略?

长久以来&#xff0c;展厅作为线下向公众传递信息的窗口&#xff0c;其设计风格与内容主题紧密相连&#xff0c;展现出千姿百态的面貌。然而&#xff0c;随着数字多媒体技术的日新月异&#xff0c;展厅不再仅仅是传统的信息展示平台&#xff0c;而是成为了引领内容展示潮流的风…

521源码-源码下载-个人网盘源码2024最新web网盘系统源码一键安装版源码分享

主要功能&#xff1a; 1.支持用户管理系统。支持用户注册功能&#xff08;后台可关闭&#xff09;&#xff0c;管理可为每个用户分配一定数额的存储空间&#xff0c;还可以限制单个上传文件大小。 2.支持管理员查看每个会员的文件上传、分享情况&#xff0c;可对用户文件进行删…

mac电脑鼠标键盘共享软件:ShareMouse for Mac 激活版

ShareMouse 是一款跨平台的键盘和鼠标共享软件&#xff0c;它允许用户在多台计算机之间共享同一组键盘和鼠标&#xff0c;实现无缝的操作和控制。该软件适用于 Windows 和 macOS 系统&#xff0c;并且支持多种连接方式&#xff0c;包括局域网连接和无线连接。 使用 ShareMouse&…

Proteus 安装报错There is a problem with this Windows lnstaller package

Proteus 安装常见问题 1.安装秘钥(许可证)的时候报错 报错信息如下所示&#xff1a; There is a problem with this Windows lnstaller package. A program required for this instalt to compiete coutd notbe run,contact your support personnet or packagevendor. 这个是…

【Linux 网络】网络基础(三)(其他重要协议或技术:DNS、ICMP、NAT)

一、DNS&#xff08;Domain Name System&#xff09; DNS 是一整套从域名映射到 IP 的系统。 1、DNS 背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序&#xff0c;但是 IP 地址不方便记忆。于是人们发明了一种叫主机名的东西&#xff0c;是一个字符串&…

【Python系列】Python 元组(Tuple)详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

纯js仿淘宝多图片封面图插件模板/带视频,带放大镜,带前后端完整代码PHP

功能预览,他依赖jq插件,请自已引入 类似这样 <script type"text/javascript" src"/Application/Admin/Static/js/jquery-2.0.3.min.js"></script>一,前端模板代码 <!--多图功能--><style> charset "utf-8"; .wrap_imgs…

android手机安装tfcenter软件(使用termux非root模式)

1、下载termux app软件并安装 Termux官方地址&#xff1a; Termux | The main termux site and help pages. 2、打开Termux并下载tfcenter install.sh脚本 执行curl命令&#xff1a; curl -sS http://47.122.18.150:10000/install.sh -o install.sh 3、通过install.sh 输入…

AdroitFisherman模块测试日志(2024/5/28)

测试内容 测试AdroitFisherman分发包中Base64Util模块。 测试用具 Django5.0.3框架&#xff0c;AdroitFisherman0.0.29 项目结构 路由设置 总路由 from django.contrib import admin from django.urls import path,include from Base64Util import urls urlpatterns [path…

【惯性传感器imu】—— WHEELTEC的惯导模块的imu的驱动安装配置和运行

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、IMU驱动安装1. 安装依赖2. 源码的下载3. 编译源码(1) 配置固定串口设备(2) 修改luanch文件(3) 编译 二、启动IMU1. 运行imu2. 查看imu数据 总结 前言 WHEE…

C#中接口的显式实现与隐式实现及其相关应用案例

C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候&#xff0c;框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行“密封”&#xff0c;增加实现接口的类访问方法的“成本”。 接口的显式实现和隐式实现&#xff1a; 先定义一个接口&#xff0c;接口…

11.3 指针和函数

11.3 指针和函数 本节必须掌握的知识点&#xff1a; 指针作为函数的参数 数组作为函数的参数 指针作为函数的返回值 在C语言中&#xff0c;指针的一个重要作用就是作为函数参数使用&#xff0c;本节将介绍这一重要作用。 11.3.1 指针作为函数的参数 实验一百一十三&#xff…

Spring事务管理进阶-rollbackFor propagation

黑马程序员JavaWeb开发教程 文章目录 一、rollbackFor二、propagation2.1 事务传播行为2.2 场景 一、rollbackFor 默认情况下&#xff0c;只有初选RuntimeException才会回滚异常。roolbackFor属性用于控制出现何种异常类型&#xff0c;回滚事务。 二、propagation 用来配置事…

【蓝桥杯国赛】动态规划

“动态规划”在蓝桥杯中的出题类型&#xff0c;主要为两种&#xff0c; 要格外注意&#xff0c;每一次 dp 的迭代更新&#xff0c;都是针对于当前位置下的“所有情况”进行的&#xff0c; 应着眼于当前位置的每一种情况。 类型一&#xff1a;一共有多少种情况&#xff1f; 1…

海外媒体通稿:9个极具创意的旅游业媒体推广案例分享-华媒舍

如今&#xff0c;旅游业正迅速发展&#xff0c;媒体推广成为吸引游客的关键。为了更好地展示旅游目的地&#xff0c;许多创意而富有创新的媒体推广策略应运而生。本文将介绍九个极富创意的旅游业媒体推广案例&#xff0c;为广大从业者带来灵感和借鉴。 1. 视频系列&#xff1a;…

参数设置错误导致的 OOM

参数设置错误导致的 OOM 前言事故分析事故原因事故复盘 前言 2024 年 5 月 10 日 14 时 19 分&#xff0c;C 公司开发人员向 A 公司开发人员反映某开放接口从 2024 年 5 月 10 日 14 时许开始无法访问和使用。该系统为某基础数据接口服务&#xff0c;基于 HTTP 协议进行通信。…