您的位置:首页 > 移动开发 > 微信开发

微信公众号上传多媒体文件

2015-12-18 10:23 423 查看
公众号在使用接口时,对多媒体文件、多媒体消息的获取和调用等操作,是通过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"


参数说明
参数是否必须说明
access_token调用接口凭证
type媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
mediaform-data中媒体文件标识,有filename、filelength、content-type等信息
返回说明

正确情况下的返回JSON数据包结果如下:
{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}

参数描述
type媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb,主要用于视频与音乐格式的缩略图)
media_id媒体文件上传后,获取时的唯一标识
created_at媒体文件上传时间戳
错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):
{"errcode":40004,"errmsg":"invalid media type"}


注意事项

上传的多媒体文件有格式和大小限制,如下:
图片(image): 1M,支持JPG格式
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式

媒体文件在后台保存时间为3天,即3天后media_id失效。

使用网页调试工具调试该接口

实现代码:

package com.gta.test;

import java.io.BufferedReader;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import org.json.JSONException;

import org.json.JSONObject;

import com.gta.tool.WeixinUtils;

public class UploadFileToWeiXinServer {

public static String access_token =null;

////个人订阅号或者公众号的appId和appSecret

// public static String appId="xxxxxxxxxxxxxxxxx";

// public static String appSecret="xxxxxxxxxxxxxxx";

//微信平台测试账号的appId和appSecret
public static String appId ="xxxxxxxxxxxxxxxx";
public static String appSecret ="xxxxxxxxxxxxxxxxxxx";

static{

//通过微信公众号的appId和appSecret的值,初始化加载获取access_token值
access_token=WeixinUtils.getAccessToken(appId, appSecret);
}

public static void main(String[] args) throws JSONException {
File file=new File("D:/voice.amr");
uploadPermanentMedia2(access_token, file, "voice", "voice");//我这里就是上传语音消息为例
}
/**
* 这里说下,在上传视频素材的时候,微信说不超过20M,我试了下,超过10M调通的可能性都比较小,建议大家上传视频素材的大小小于10M比交好
* @param accessToken
* @param file  上传的文件
* @param title  上传类型为video的参数
* @param introduction 上传类型为video的参数
* @throws JSONException 
*/
public static void uploadPermanentMedia2(String accessToken,
File file,String title,String introduction) throws JSONException {
try {
JSONObject j=new JSONObject();
//这块是用来处理如果上传的类型是video的类型的
j.put("title", title);
j.put("introduction", introduction);

// 拼装请求地址
String uploadMediaUrl = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
uploadMediaUrl = uploadMediaUrl.replace("ACCESS_TOKEN", accessToken);

                        URL url = new URL(uploadMediaUrl);
String result = null;
long filelength = file.length();
String fileName=file.getName();

// String suffix=fileName.substring(fileName.lastIndexOf("."),fileName.length());
String type="voice/amr"; //我这里写死
/**
*  你们需要在这里根据文件后缀suffix将type的值设置成对应的mime类型的值
*/
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST"); // 以Post方式提交表单,默认get方式
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false); // post方式不能使用缓存
// 设置请求头信息
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");

// 设置边界,这里的boundary是http协议里面的分割符,不懂的可惜百度(http 协议 boundary),这里boundary 可以是任意的值(111,2222)都行
String BOUNDARY = "----------" + System.currentTimeMillis();
con.setRequestProperty("Content-Type","multipart/form-data; boundary=" + BOUNDARY);
// 请求正文信息
// 第一部分:
StringBuilder sb = new StringBuilder();
//这块是post提交type的值也就是文件对应的mime类型值
sb.append("--"); // 必须多两道线 这里说明下,这两个横杠是http协议要求的,用来分隔提交的参数用的,不懂的可以看看http 协议头
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"type\" \r\n\r\n"); //这里是参数名,参数名和值之间要用两次
sb.append(type+"\r\n"); //参数的值

//这块是上传video是必须的参数,你们可以在这里根据文件类型做if/else 判断
sb.append("--"); // 必须多两道线
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"description\" \r\n\r\n");
sb.append(j.toString()+"\r\n");

/**
* 这里重点说明下,上面两个参数完全可以卸载url地址后面 就想我们平时url地址传参一样,
* http://api.weixin.qq.com/cgi-bin/material/add_material?access_token=##ACCESS_TOKEN##&type=""&description={} 这样,如果写成这样,上面的
* 那两个参数的代码就不用写了,不过media参数能否这样提交我没有试,感兴趣的可以试试
*/

sb.append("--"); // 必须多两道线
sb.append(BOUNDARY);
sb.append("\r\n");
//这里是media参数相关的信息,这里是否能分开下我没有试,感兴趣的可以试试
sb.append("Content-Disposition: form-data;name=\"media\";filename=\"" + fileName + "\";filelength=\"" + filelength + "\" \r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");
System.out.println(sb.toString());
byte[] head = sb.toString().getBytes("utf-8");
// 获得输出流
OutputStream out = new DataOutputStream(con.getOutputStream());
// 输出表头
out.write(head);
// 文件正文部分
// 把文件已流文件的方式 推入到url中
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();
// 结尾部分,这里结尾表示整体的参数的结尾,结尾要用"--"作为结束,这些都是http协议的规定
byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
out.write(foot);
out.flush();
out.close();
StringBuffer buffer = new StringBuffer();
BufferedReader reader = null;
// 定义BufferedReader输入流来读取URL的响应
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
if (result == null) {
result = buffer.toString();
}
System.out.println("result:"+result);
// 使用JSON-lib解析返回结果
JSONObject jsonObject =new JSONObject(result);
if (jsonObject.has("media_id")) {
System.out.println("media_id:"+jsonObject.getString("media_id"));
} else {
System.out.println(jsonObject.toString());
}
System.out.println("json:"+jsonObject.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: