微信公众号上传媒体文件

2023-10-22 12:32

本文主要是介绍微信公众号上传媒体文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

公众号在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。通过本接口,公众号可以上传或下载多媒体文件。但请注意,每个多媒体文件(media_id)会在上传、用户发送到微信服务器3天后自动删除,以节省服务器资源。

公众号可调用本接口来上传图片、语音、视频等文件到微信服务器,上传后服务器会返回对应的media_id,公众号此后可根据该media_id来获取多媒体。请注意,media_id是可复用的,调用该接口需http协议。

接口调用请求说明

http请求方式: POST/FORM
http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件):
curl -F media=@test.jpg "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"


首先封装一个HttpPostUtil类,专门负责文件上传请求及一些参数的设置(此处可以理解为上传文件表单参数设置和connection的一些必须设置)、字符编码,文件类型等。

HttpPostUtil类代码:

import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;/*** * @author Sunlight* */
public class HttpPostUtil {private URL url;private HttpURLConnection conn;private String boundary = "--------httppost123";private HashMap<String, String> textParams = new HashMap<String, String>();private HashMap<String, File> fileparams = new HashMap<String, File>();private DataOutputStream outputStream;public HttpPostUtil(String url) throws Exception {this.url = new URL(url);}/*** 重新设置要请求的服务器地址,即上传文件的地址。* * @param url* @throws Exception*/public void setUrl(String url) throws Exception {this.url = new URL(url);}/*** 增加一个普通字符串数据到form表单数据中* * @param name* @param value*/public void addParameter(String name, String value) {textParams.put(name, value);}/*** 增加一个文件到form表单数据中* * @param name* @param value*/public void addParameter(String name, File value) {fileparams.put(name, value);}/*** 清空所有已添加的form表单数据*/public void clearAllParameters() {textParams.clear();fileparams.clear();}/*** 发送数据到服务器,返回一个字节包含服务器的返回结果的数组* * @return* @throws Exception*/public String send() throws Exception {initConnection();conn.connect();outputStream = new DataOutputStream(conn.getOutputStream());writeFileParams();writeStringParams();paramsEnd();int code = conn.getResponseCode();if (code == 200) {InputStream in = conn.getInputStream();ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] buf = new byte[1024 * 8];int len;while ((len = in.read(buf)) != -1) {out.write(buf, 0, len);}conn.disconnect();String s = new String(out.toByteArray(), "utf-8");return s;}return null;}/*** 文件上传的connection的一些必须设置* * @throws Exception*/private void initConnection() throws Exception {conn = (HttpURLConnection) this.url.openConnection();conn.setDoOutput(true);conn.setUseCaches(false);conn.setConnectTimeout(10000); // 连接超时为10秒conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);}/*** 普通字符串数据* * @throws Exception*/private void writeStringParams() throws Exception {Set<String> keySet = textParams.keySet();for (Iterator<String> it = keySet.iterator(); it.hasNext();) {String name = it.next();String value = textParams.get(name);outputStream.writeBytes("--" + boundary + "\r\n");outputStream.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"\r\n");outputStream.writeBytes("\r\n");outputStream.writeBytes(encode(value) + "\r\n");}}/*** 文件数据* * @throws Exception*/private void writeFileParams() throws Exception {Set<String> keySet = fileparams.keySet();for (Iterator<String> it = keySet.iterator(); it.hasNext();) {String name = it.next();File value = fileparams.get(name);outputStream.writeBytes("--" + boundary + "\r\n");outputStream.writeBytes("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + encode(value.getName()) + "\"\r\n");outputStream.writeBytes("Content-Type: " + getContentType(value) + "\r\n");outputStream.writeBytes("\r\n");outputStream.write(getBytes(value));outputStream.writeBytes("\r\n");}}/*** 获取文件的上传类型,图片格式为image/png,image/jpeg等。非图片为application /octet-stream* * @param f* @return* @throws Exception*/private String getContentType(File f) throws Exception {return "application/octet-stream";}/*** 把文件转换成字节数组* * @param f* @return* @throws Exception*/private byte[] getBytes(File f) throws Exception {FileInputStream in = new FileInputStream(f);ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] b = new byte[1024];int n;while ((n = in.read(b)) != -1) {out.write(b, 0, n);}in.close();return out.toByteArray();}/*** 添加结尾数据* * @throws Exception*/private void paramsEnd() throws Exception {outputStream.writeBytes("--" + boundary + "--" + "\r\n");outputStream.writeBytes("\r\n");}/*** 对包含中文的字符串进行转码,此为UTF-8。服务器那边要进行一次解码* * @param value* @return* @throws Exception*/private String encode(String value) throws Exception {return URLEncoder.encode(value, "UTF-8");}	
}
上传测试方法(可以在自己项目中上传文件到一些第三方提供的平台):
/*** 使用方法示例* 此方法需要修改成自己上传地址才可上传成功* @param args* @throws Exception*/
public static void test(String[] args) throws Exception {File file=new File("D\\up.jpg");//此处修改为自己上传文件的地址HttpPostUtil post = new HttpPostUtil("http://www.omsdn.cn"); //此处参数类似 curl -F media=@test.jpgpost.addParameter("media", file);post.send();
}

上传文件方法封装好后,微信公众号上传文件类调用,此处需要JSON包(json-lib-2.2.3-jdk13.jar):

import java.io.File;
import cn.<span style="font-family:FangSong_GB2312;">xx</span>.wechat.model.MdlUpload;
import cn.<span style="font-family:FangSong_GB2312;">xx</span>.wechat.model.Result;
import net.sf.json.JSONObject;
/*** * @author Sunlight**/
public class FileUpload {private static final String upload_url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
/**
* 上传文件
* 
* @param accessToken
* @param type
* @param file
* @return
*/
public static Result<MdlUpload> Upload(String accessToken, String type, File file) {
Result<MdlUpload> result = new Result<MdlUpload>();
String url = upload_url.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
JSONObject jsonObject;
try {
HttpPostUtil post = new HttpPostUtil(url);
post.addParameter("media", file);
String s = post.send();
jsonObject = JSONObject.fromObject(s);
if (jsonObject.containsKey("media_id")) {
MdlUpload upload=new MdlUpload();
upload.setMedia_id(jsonObject.getString("media_id"));
upload.setType(jsonObject.getString("type"));
upload.setCreated_at(jsonObject.getString("created_at"));
result.setObj(upload);
result.setErrmsg("success");
result.setErrcode("0");
} else {
result.setErrmsg(jsonObject.getString("errmsg"));
result.setErrcode(jsonObject.getString("errcode"));
}
} catch (Exception e) {
e.printStackTrace();
result.setErrmsg("Upload Exception:"+e.toString());
}
return result;
}
}

调用方法需要引用2个Model类(返回结果类和上传文件类型类):

返回结果类:

package cn.<span style="font-family:FangSong_GB2312;">xx</span>.wechat.model;public class Result<T> {private T obj;private String errcode;private String errmsg;public T getObj() {return obj;}public void setObj(T obj) {this.obj = obj;}
<span style="font-family:FangSong_GB2312;">        </span>public String getErrcode() {return errcode;}public void setErrcode(String errcode) {this.errcode = errcode;}public String getErrmsg() {return errmsg;}public void setErrmsg(String errmsg) {this.errmsg = errmsg;}}

文件上传返回文件类型类:
package cn.<span style="font-family:FangSong_GB2312;">xx</span>.wechat.model;public class MdlUpload {private String type;private String media_id;private String created_at;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getMedia_id() {return media_id;}public void setMedia_id(String mediaId) {media_id = mediaId;}public String getCreated_at() {return created_at;}public void setCreated_at(String createdAt) {created_at = createdAt;}public MdlUpload() {super();}@Overridepublic String toString() {return "MdlUpload [created_at=" + created_at + ", media_id=" + media_id + ", type=" + type + "]";}}

最后微信上传文件测试方法:
@Test
public void testUpload() {
File file=new File("E:\\Tulips.jpg");
System.err.println(file.getName());
Result<MdlUpload> result=FileUpload .Upload("image", file);
System.out.println("Errcode="+result.getErrcode()+"\tErrmsg="+result.getErrmsg());
System.out.println(result.getObj().toString());
}

测试结果:




本人微信公众号:http://www.omsdn.cn 点击二维码关注!





这篇关于微信公众号上传媒体文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/261488

相关文章

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

使用mvn deploy命令上传jar包的实现

《使用mvndeploy命令上传jar包的实现》本文介绍了使用mvndeploy:deploy-file命令将本地仓库中的JAR包重新发布到Maven私服,文中通过示例代码介绍的非常详细,对大家的学... 目录一、背景二、环境三、配置nexus上传账号四、执行deploy命令上传包1. 首先需要把本地仓中要

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Java文件上传的多种实现方式

《Java文件上传的多种实现方式》文章主要介绍了文件上传接收接口的使用方法,包括获取文件信息、创建文件夹、保存文件到本地的两种方法,以及如何使用Postman进行接口调用... 目录Java文件上传的多方式1.文件上传接收文件接口2.接口主要内容部分3.postman接口调用总结Java文件上传的多方式1

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-