springboot直接将网络图片上传到临时素材【微信公号自动回复图片】

需求:

关注公众号自动回复图片,但是图片又存储在oss,所以这个时候需要将网络图片直接转化为临时素材。

思路:

将图片先转成文件流,然后通过上传临时素材接口上传。而大部分的思路都是将服务器本地的文件上传到临时素材。

成果:

在这里插入图片描述

开发:

  /**
     * @param fileUrl 文件的访问链接
     * @param fileType "image"
     * @return
     * @throws Exception
     */
    public JSONObject uploadTempMedia(String fileUrl, String fileType) throws Exception{
        String accessToken = getWeChatAccessToken();
        String urlString = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + accessToken + "&type=" + fileType;
        //返回结果
        String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
        // 获取网络图片
        URL mediaUrl = new URL(fileUrl);
        HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();
        meidaConn.setDoOutput(true);
        meidaConn.setRequestMethod("GET");

        String result = null;
        URL url=new URL(urlString);
        HttpsURLConnection conn=(HttpsURLConnection) url.openConnection();
        conn.setRequestMethod("POST");//以POST方式提交表单
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);//POST方式不能使用缓存
        //设置请求头信息
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Charset", "UTF-8");
        //设置边界
        String BOUNDARY="----------"+System.currentTimeMillis();
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
        //请求正文信息
        //第一部分
        StringBuilder sb=new StringBuilder();
        sb.append("--");//必须多两条道
        sb.append(BOUNDARY);
        sb.append("\r\n");
        sb.append("Content-Disposition: form-data;name=\"media\"; filename=\"" + fileName+"\"\r\n");

        sb.append("Content-Type:application/octet-stream\r\n\r\n");
        System.out.println("sb:"+sb);

        //获得输出流
        OutputStream out=new DataOutputStream(conn.getOutputStream());
        //输出表头
        out.write(sb.toString().getBytes("UTF-8"));
        //文件正文部分
        //把文件以流的方式 推送道URL中
        DataInputStream din=new DataInputStream(meidaConn.getInputStream());
        int bytes=0;
        byte[] buffer=new byte[1024];
        while((bytes=din.read(buffer))!=-1){
            out.write(buffer,0,bytes);
        }
        din.close();
        //结尾部分
        byte[] foot=("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");//定义数据最后分割线
        out.write(foot);
        out.flush();
        out.close();
        if(HttpsURLConnection.HTTP_OK==conn.getResponseCode()){
            StringBuffer strbuffer=null;
            BufferedReader reader=null;
            try {
                strbuffer=new StringBuffer();
                reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
                String lineString=null;
                while((lineString=reader.readLine())!=null){
                    strbuffer.append(lineString);
                }
                if(result==null){
                    result=strbuffer.toString();
                    System.out.println("result:"+result);
                }
            } catch (IOException e) {
                System.out.println("发送POST请求出现异常!"+e);
                e.printStackTrace();
            }finally{
                if(reader!=null){
                    reader.close();
                }
            }
        }
        JSONObject jsonObject=JSONObject.parseObject(result);
        return jsonObject;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 Node.js 调用企业微信上传临时素材 API 上传网络图片的示例代码: ```javascript const https = require('https'); const fs = require('fs'); const path = require('path'); const accessToken = 'your_access_token'; const baseUrl = 'https://qyapi.weixin.qq.com/cgi-bin/'; const imageUrl = 'https://example.com/image.png'; const uploadUrl = baseUrl + 'media/upload?access_token=' + accessToken + '&type=image'; https.get(imageUrl, (res) => { let data = ''; res.setEncoding('binary'); res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { const fileName = path.basename(imageUrl); const fileData = new Buffer(data, 'binary'); const postData = { 'media': fileData }; const requestOptions = { method: 'POST', headers: { 'Content-Type': 'multipart/form-data' } }; const req = https.request(uploadUrl, requestOptions, (res) => { let body = ''; res.on('data', (chunk) => { body += chunk; }); res.on('end', () => { const response = JSON.parse(body); if (response.errcode === 0) { console.log('上传成功,素材 ID:' + response.media_id); } else { console.error('上传失败:' + response.errmsg); } }); }); const boundaryKey = Math.random().toString(16); const boundary = '----' + boundaryKey; const endBoundary = '\r\n--' + boundary + '--\r\n'; const contentDisposition = 'Content-Disposition: form-data; name="media"; filename="' + fileName + '"\r\n'; const contentType = 'Content-Type: image/png\r\n\r\n'; const payload = '--' + boundary + '\r\n' + contentDisposition + contentType + fileData.toString('binary') + endBoundary; req.write(payload); req.end(); }); }).on('error', (e) => { console.error('下载图片时发生错误:' + e.message); }); ``` 请将 `your_access_token` 替换为您的企业微信应用的 access_token,`imageUrl` 替换为您的网络图片的 URL。此代码将从指定的 URL 下载图片,并使用 multipart/form-data 格式,将图片文件上传到企业微信临时素材库中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值