java开发微信订阅号群发功能(三)

java开发微信订阅号群发功能(三)

上篇完成了群发消息的文本群发
但是文本字数有限制,所以就需要功能更加强大的群发图文消息
群发文本消息需要上传素材之后获取media_id。
微信官方提供了两个上传素材的接口
一个是永久素材文件的上传如下
在这里插入图片描述
接口链接:`

https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN

一个是零时文件上传接口如下
在这里插入图片描述
注意这个素材上传只能上传零时的
上传示例

 @RequestMapping("/uploadFile")
    @ResponseBody
    public Map<String, Object > uploadFile(String type) throws Exception {
        //获取access_token
        Map<String, String> stringMap = this.getToken();
        String accessToken = stringMap.get("access_token");
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

        String realPath = request.getSession().getServletContext().getRealPath("/");
        String fileUrl= realPath+"/images/zmDistributor.jpg";
        System.out.println(realPath);

        //指定文件路劲,
        File file=new File(fileUrl);
//        File file=new File("D:\\images\\7d5139bcd8fdd73245a2b5d7bbd7bb19.jpg");

        //如果文件类型没有指定,则默认为图片
        if("".equals(type)||type==null){
            type = "image";
        }

        //文件上传路劲
        String url = " https://api.weixin.qq.com/cgi-bin/media/upload?access_token="
                + accessToken + "&type="+type;

        /* (永久素材上传路径,如需要上传永久素材,直接换路径)
        String url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token="+ access_token + "&type=" + type;
        */
        String title ="";
        String introduction="";

        String result = null;
        try {
            //设置请求参数
            URL uploadURL = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) uploadURL.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(30000);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Cache-Control", "no-cache");
            String boundary = "-----------------------------" + System.currentTimeMillis();
            conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);

            //对文件进行读写
            OutputStream output = conn.getOutputStream();
            output.write(("--" + boundary + "\r\n").getBytes());
            output.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"%s\"\r\n", file.getName()).getBytes());
            output.write("Content-Type: video/mp4 \r\n\r\n".getBytes());

            byte[] data = new byte[1024];
            int len = 0;
            FileInputStream input = new FileInputStream(file);
            while ((len = input.read(data)) > -1) {
                output.write(data, 0, len);
            }

			/*对类型为video的素材进行特殊处理*/
            if ("video".equals(type)) {
                output.write(("--" + boundary + "\r\n").getBytes());
                output.write("Content-Disposition: form-data; name=\"description\";\r\n\r\n".getBytes());
                output.write(String.format("{\"title\":\"%s\", \"introduction\":\"%s\"}", title, introduction).getBytes());
            }

            output.write(("\r\n--" + boundary + "--\r\n\r\n").getBytes());
            output.flush();
            output.close();
            input.close();

            InputStream resp = conn.getInputStream();

            StringBuffer sb = new StringBuffer();

            while ((len = resp.read(data)) > -1)
                sb.append(new String(data, 0, len, "utf-8"));
            resp.close();
            result = sb.toString();
        } catch (IOException e) {
            //....
        }
        //获取到文件上传的返回值,封装map方便后续使用
        JSONObject jsonObject = JSONObject.fromObject(result);
        Map<String, Object> map = (Map) jsonObject;
        map.put("access_token",accessToken);
        map.put("phone",stringMap.get("phone"));
        System.out.println(map.toString());
        return map;
    }

至此文件上传就已经完成了
注意我这里文件是直接读取的本地的某个目录文件,可以自定义,也可以自己上传

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值