[本文所描述的内容具有一定的时效性,请以实际开发所处环境为准]
今天我们来跟大家介绍我们在消息发送环节使用的各种类型素材是怎么获取与使用的。本文依然是只介绍其中一种典型的实现方式,其他类似的实现,还请大家积极主动的亲自尝试一番为好!废话不多讲,概念性的东西,请直接查看企业号开发接口文档
-------------------------------------------------------------------------------------------------------------------------------------------------
正文开始:
我们就以当前目录下第一个上传临时素材文件为例说明如何使用与管理文件:
1.首先,查看官方文档对于第一个条目的解释:
以往按照惯例,应该在给大家重复一遍。但是到目前的话,大家应该知道如何查看阅读官方文档了。在此,就不给大家再啰嗦了。详情见上图。
2.与前文不同,这次我们要发送的文件,而不是一般的JSON格式的字符串。具体该怎么做呢?由于这部分设计网络编程的内容,但是又不是我们本文关注的重点,因此就直接看看代码是如何实现的。在此,下面代码中已经讲过的微信部分的内容就不再叙述的含义及获取方式,请自行查阅前文。
特别的是:
a.这种方法不止用于对接微信接口,我们一般情况下,也能够使用这种方式完成文件的传输。
b.下面的这种方式适用于远程获取文件,远程上传文件。如本地是B服务器,便可以将C服务器的文件上传到A服务器文件。如果是本地上传,那么下面的代码就需要一定调整。修改的方式是将远程的IO流变为本地IO流即可。
/**
* 上传媒体文件
* @param accessToken 接口访问凭证
* @param type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
* @param media form-data中媒体文件标识,有filename、filelength、content-type等信息
* @param mediaFileUrl 媒体文件的url
* 上传的媒体文件限制
* 图片(image):1MB,支持JPG格式
* 语音(voice):2MB,播放长度不超过60s,支持AMR格式
* 视频(video):10MB,支持MP4格式
* 普通文件(file):20MB
* */
public JSONObject uploadMedia(String accessToken, String type, String mediaFileUrl) {
// 拼装请求地址
String uploadMediaUrl = "开发者文档中的地址,由于时效性,请查阅之后,放在此处";
uploadMediaUrl = uploadMediaUrl.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
// 定义数据分隔符
String boundary = "------------7da2e536604c8";
try {
URL uploadUrl = new URL(uploadMediaUrl);
HttpURLConnection uploadConn = (HttpURLConnection) uploadUrl.openConnection();
uploadConn.setDoOutput(true);
uploadConn.setDoInput(true);
uploadConn.setRequestMethod("POST");
// 设置请求头Content-Type
uploadConn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
// 获取媒体文件上传的输出流
OutputStream outputStream = uploadConn.getOutputStream();
URL mediaUrl = new URL(mediaFileUrl);
HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();
meidaConn.setDoOutput(true);
meidaConn.setRequestMethod("GET");
// 从请求头中获取内容类型
String contentType = meidaConn.getContentType();
// 根据内容类型判断文件扩展名
String fileExt = "此处需要将我们的上传的文件声明为具体的文件类型,自行实现。"
// 请求体开始
outputStream.write(("--" + boundary + "\r\n").getBytes());
outputStream.write(String.format("Content-Disposition: form-data; name=\"media\"; filename=\"file1%s\"\r\n", fileExt).getBytes());
outputStream.write(String.format("Content-Type: %s\r\n\r\n", contentType).getBytes());
// 获取媒体文件的输入流
BufferedInputStream bis = new BufferedInputStream(meidaConn.getInputStream());
byte[] buf = new byte[8096];
int size = 0;
while ((size = bis.read(buf)) != -1) {
// 将媒体文件写到输出流(往微信服务器写数据)
outputStream.write(buf, 0, size);
}
// 请求体结束
outputStream.write(("\r\n--" + boundary + "--\r\n").getBytes());
outputStream.close();
bis.close();
meidaConn.disconnect();
// 获取媒体文件上传的输入流
InputStream inputStream = uploadConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuffer buffer = new StringBuffer();
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 释放资源
inputStream.close();
inputStream = null;
uploadConn.disconnect();
// 使用JSON-lib解析返回结果
JSONObject jsonObject = JSONObject.fromObject(buffer.toString());
} catch (Exception e) {
//日志处理等,请自行完善。
}
return jsoonObject;
}
3.基本实现函数完成之后,我们可以进行一个简单的单元测试,看看能不能够从微信后台正确的返回媒体文件的id值供我们使用。特别注意的是,这个id值,无论是临时文件,还是永久文件,都请妥善保存,方便后续使用。
4.关于已经上传的媒体文件如何使用,我们将在接下来的发送消息中进行介绍,敬请期待!
-----------------------------------------------------------------------------------------------------------------------------------------------------
至此,微信企业号开发(5)--管理素材文件结束。
特别说明:
上文的示例代码有参考多位来自其他博主的文件上传介绍及实现,但由于写这篇文章是时间相距较远,已经不记得具体出处,如果原作者看到,请留言,随后一定注明出处!
参考资料:
[1]微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/home/index.html
[2]企业号开发者接口文档:http://qydev.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5