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 {
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);
HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
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];
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;
}
}
转载请注明原文地址:https://ipadbbs.8miu.com/read-47520.html