微信公众号上传媒体文件

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

相关文章

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

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

Spring MVC 图片上传

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

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

在SSH的基础上使用jquery.uploadify.js上传文件

在SSH框架的基础上,使用jquery.uploadify.js实现文件的上传,之前搞了好几天,都上传不了, 在Action那边File接收到的总是为null, 为了这个还上网搜了好多相关的信息,但都不行,最后还是搜到一篇文章帮助到我了,希望能帮助到为之困扰的人。 jsp页面的关键代码: <link rel="stylesheet" type="text/css" href="${page

【CTF Web】BUUCTF Upload-Labs-Linux Pass-13 Writeup(文件上传+PHP+文件包含漏洞+PNG图片马)

Upload-Labs-Linux 1 点击部署靶机。 简介 upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。 注意 1.每一关没有固定的通关方法,大家不要自限思维! 2.本项目提供的writeup只是起一个参考作用,希望大家可以分享出自己的通关思路

Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

基于微信小程序与嵌入式系统的智能小车开发(详细流程)

一、项目概述 本项目旨在开发一款智能小车,结合微信小程序与嵌入式系统,提供实时图像处理与控制功能。用户可以通过微信小程序远程操控小车,并实时接收摄像头采集的图像。该项目解决了传统遥控小车在图像反馈和控制延迟方面的问题,提升了小车的智能化水平,适用于教育、科研和娱乐等多个领域。 二、系统架构 1. 系统架构设计 本项目的系统架构主要分为以下几个部分: 微信小程序:负责用户界面、控制指令的

微信小程序uniappvue3版本-控制tabbar某一个的显示与隐藏

1. 首先在pages.json中配置tabbar信息 2. 在代码根目录下添加 tabBar 代码文件 直接把微信小程序文档里面的四个文件复制到自己项目中就可以了   3. 根据自己的需求更改index.js文件 首先我这里需要判断什么时候隐藏某一个元素,需要引入接口 然后在切换tabbar时,改变tabbar当前点击的元素 import getList from '../

微信小程序(一)数据流与数据绑定

一、单向数据流和双向数据流 1、单项数据流:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面 优点:数据跟踪方便,流向单一,追寻问题比较方便【主要体现:微信小程序】。 缺点:就是写起来不太方便,如果修改UI界面数据需要维护对应的model对象 2、双向数据流:值和UI是双向绑定的,大家都知道,只要UI里面的值发生