java实现微信上传永久图片素材“errcode“:41005,“errmsg“:“media data missing hint: [xxxxxxxxx]“

    技术2024-01-19  115

    java微信上传永久图片素材

    最近在做关于微信公众号接口的问题,发现上传永久素材微信开发文档对于小白不是很友善. 1.临时素材和永久素材没有关系,在微信服务器可以保存三天。新增的临时素材只能通过media_id(临时素材)获取。 2.新增图文素材以外的素材,需要使用**新增其他类型永久素材**接口,其中文档写的地址为:http请求方式: POST,需使用https https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE 3.官方分档入口: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Adding_Permanent_Assets.html

    restTemplate尝试

    1.习惯使用restTemplate调用https,微信永久素材上传不推荐使用,一直返回"errcode":41005,"errmsg":"media data missing hint: [XXXXXXXXXX]",源文件不正确, 2.本人使用: MultiValueMap<String,Object> requestData = new LinkedMultiValueMap<>();进行的参数封装

    原生HttpURLConnection 实现永久素材上传

    package com.lenovo.smartretail.util; import com.alibaba.fastjson.JSONObject; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class ImageUpLoad { /** * 新增临时素材 * * @param filePath 文件路径 D://XXX.jpg * @param accessToken 公众号接口唯一凭证 * @param type 消息类型 type: image * @return * @throws Exception */ public static String uploadFile(String URL, String filePath, String accessToken, String type) throws Exception { File file = new File(filePath); if (!file.exists() || !file.isFile()) { throw new IOException("文件不存在!"); } String url = URL.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type); URL urlObj = new URL(url); // 创建Http连接 HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); conn.setRequestMethod("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=\"" + file.getName() + "\";filelength=\"" + file.length() + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); byte[] head = sb.toString().getBytes("utf-8"); // 创建输出流 OutputStream out = new DataOutputStream(conn.getOutputStream()); // 获得输出流表头 out.write(head); //文件正文部分 DataInputStream in = new DataInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024 * 1024 * 10]; // 10M while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } in.close(); //结尾 byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8"); out.write(foot); out.flush(); out.close(); // 获取响应 StringBuffer buffer = new StringBuffer(); BufferedReader reader = null; String result = null; try { reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { buffer.append(line); } if (result == null) { result = buffer.toString(); } } catch (IOException e) { e.printStackTrace(); } finally { reader.close(); } JSONObject json = JSONObject.parseObject(result); System.out.println(json); String mediaId = ""; if (!type.equals("image")) { mediaId = json.getString(type + "_media_id"); } else { mediaId = json.getString("media_id"); } return mediaId; } }
    Processed: 0.015, SQL: 10