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

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

文档介绍

企业发表内容到客户的朋友圈的文档地址: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代码,所以在开发时关于上传附件资源这块比较费劲,这里是最后上传成功的版本,希望对大家有帮助,有问题的小伙伴也可以一起讨论哈。

相关推荐
豆 腐2 小时前
MySQL【四】
android·数据库·笔记·mysql
想取一个与众不同的名字好难4 小时前
android studio导入OpenCv并改造成.kts版本
android·ide·android studio
Jewel1054 小时前
Flutter代码混淆
android·flutter·ios
Yawesh_best5 小时前
MySQL(5)【数据类型 —— 字符串类型】
android·mysql·adb
曾经的三心草8 小时前
Mysql之约束与事件
android·数据库·mysql·事件·约束
guoruijun_2012_412 小时前
fastadmin多个表crud连表操作步骤
android·java·开发语言
Winston Wood12 小时前
一文了解Android中的AudioFlinger
android·音频
B.-14 小时前
Flutter 应用在真机上调试的流程
android·flutter·ios·xcode·android-studio
有趣的杰克14 小时前
Flutter【04】高性能表单架构设计
android·flutter·dart
大耳猫19 小时前
主动测量View的宽高
android·ui