企业微信接入系列-上传附件资源

企业微信接入系列-上传附件资源

文档介绍

企业发表内容到客户的朋友圈的文档地址:https://developer.work.weixin.qq.com/document/path/93506,在企业发表内容到客户朋友圈的接口中涉及到上传附件资源的操作,具体文档地址:https://developer.work.weixin.qq.com/document/path/95098,本文主要讲述的就是上传附件资源的操作。

上传附件资源

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

1.更改上传链接

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

html 复制代码
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上传方法

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());

        }

    }

企业微信接口调用方法

java 复制代码
   /**

     * 上传附件资源--朋友圈

     * 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();

                }

            }

        }

    }

返回值对象代码

java 复制代码
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代码,所以在开发时关于上传附件资源这块比较费劲,这里是最后上传成功的版本,希望对大家有帮助,有问题的小伙伴也可以一起讨论哈。

相关推荐
JMchen12315 分钟前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs1 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob1 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔1 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9961 小时前
flutter和Android动画的对比
android·flutter·动画
lxysbly3 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首4 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
云服务器租用费用5 小时前
保姆级教程:2026年OpenClaw(原Clawdbot)零门槛部署+企业微信接入步骤
企业微信
消失的旧时光-19436 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs6 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin