[TOC]
## 概述
企业使用自定义的资源时,比如发送本地图片、视频等。为了实现同一资源文件,一次上传可以多次使用,我们提供了素材管理接口:以media\_id来标识资源文件,实现文件的上传与下载。
## 上传临时素材
把媒体文件上传到微信客服的服务器。
> 素材上传得到media\_id,该media\_id仅三天内有效
**请求方式:**POST(**HTTPS**)
**请求地址:**https://qyapi.weixin.qq.com/cgi-bin/media/upload?access\_token=ACCESS\_TOKEN&type=TYPE
使用multipart/form-data POST上传文件, 文件标识名为”media”
**参数说明:**
| 参数 | 必须 | 说明 |
| --- | --- | --- |
| access\_token | 是 | 调用接口凭证 |
| type | 是 | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) |
POST的请求包中,form-data中媒体文件标识,应包含有**filename**、filelength、content-type等信息
> filename标识文件展示的名称。比如,使用该media\_id发消息时,展示的文件名由该字段控制
**请求示例:**
~~~
POST https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token=accesstoken001&type=file HTTP/1.1Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468Content-Length: 220---------------------------acebdf13572468Content-Disposition: form-data; name="media";filename="wework.txt"; filelength=6Content-Type: application/octet-streammytext---------------------------acebdf13572468--
~~~
**返回数据:**
~~~
{ "errcode": 0, "errmsg": "", "type": "image", "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0", "created_at": "1380000000"}
~~~
**参数说明:**
| 参数 | 说明 |
| --- | --- |
| type | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) |
| media\_id | 媒体文件上传后获取的唯一标识,3天内有效 |
| created\_at | 媒体文件上传时间戳 |
**上传的媒体文件限制**
所有文件size必须大于5个字节
* 图片(image):2MB,支持JPG,PNG格式
* 语音(voice) :2MB,播放长度不超过60s,**仅支持**AMR格式
* 视频(video) :10MB,支持MP4格式
* 普通文件(file):20MB
## 获取临时素材
获取微信客服的临时素材。即下载临时的多媒体文件。
**请求方式:**GET(**HTTPS**)
**请求地址:**https://qyapi.weixin.qq.com/cgi-bin/media/get?access\_token=ACCESS\_TOKEN&media\_id=MEDIA\_ID
**参数说明 :**
| 参数 | 必须 | 说明 |
| --- | --- | --- |
| access\_token | 是 | 调用接口凭证 |
| media\_id | 是 | 媒体文件id, 见[上传临时素材](https://work.weixin.qq.com/servicer/docs_wx?id=26580#h2-u4E0Au4F20u4E34u65F6u7D20u6750) |
**返回说明 :**
正确时返回(和普通的http下载相同,请根据http头做相应的处理):
~~~
HTTP/1.1 200 OK Connection: close Content-Type: image/jpeg Content-disposition: attachment; filename="MEDIA_ID.jpg" Date: Sun, 06 Jan 2013 10:20:18 GMT Cache-Control: no-cache, must-revalidate Content-Length: 339721 Xxxx
~~~
错误时返回(这里省略了HTTP首部):
~~~
{ "errcode": 40007, "errmsg": "invalid media_id"}
~~~
**附注:支持断点下载(分块下载)**
本接口支持通过在http header里指定`Range`来分块下载。
在文件很大,可能下载超时的情况下,推荐使用分块下载。
以curl命令进行测试为例,假如我有一个2048字节的文件,
下面是获取文件前1024字节:
> curl ‘https://qyapi.weixin.qq.com/cgi-bin/media/get?access\_token=ACCESS\_TOKEN&media\_id=MEDIA\_ID’ -i -H “Range: bytes=0-1023”
生成如下http请求:
> GET /cgi-bin/media/get?access\_token=ACCESS\_TOKEN&media\_id=MEDIA\_ID HTTP/1.1
> Host: qyapi.weixin.qq.com
> Range: bytes 0-1023
服务器端会返回状态码为 206 Partial Content 的响应:
> HTTP/1.1 206 Partial Content
> Accept-Ranges: bytes
> Content-Range: bytes 0-1023/2048
> Content-Length: 1024
> …
> (1024 Bites binary content)
可以看到响应中有如下特点:
* 状态码是`206 Partial Content`,而非`200 ok`
* 返回的header中,`Accept-Ranges`首部表示可用于定义范围的单位
* 返回的header中,`Content-Range`首部表示这一部分内容在整个资源中所处的位置
更多协议详情参考[RFC: Range Requests](https://tools.ietf.org/html/rfc7233#section-4.1)