番茄主义 發表於 2020-1-19 14:44:00

微信公众号开发之新增临时素材(八)

<h3>一、新增临时素材</h3>
<p>公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。</p>
<p>注意点:</p>
<p>1、临时素材media_id是可复用的。</p>
<p>2、<strong>媒体文件在微信后台保存时间为3天,即3天后media_id失效。</strong></p>
<p>3、上传临时素材的格式、大小限制与公众平台官网一致。</p>
<p>图片(image): 2M,支持PNG\JPEG\JPG\GIF格式</p>
<p>语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式</p>
<p>视频(video):10MB,支持MP4格式</p>
<p>缩略图(thumb):64KB,支持JPG格式</p>
<p>4、需使用https调用本接口。</p>
<p><strong>接口调用请求说明</strong></p>
<p>http请求方式:POST/FORM,使用https https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&amp;type=TYPE 调用示例(使用curl命令,用FORM表单方式上传一个多媒体文件): curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&amp;type=TYPE"</p>
<p><strong>参数说明</strong></p>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>是否必须</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>access_token</td>
<td>是</td>
<td>调用接口凭证</td>
</tr>
<tr>
<td>type</td>
<td>是</td>
<td>媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</td>
</tr>
<tr>
<td>media</td>
<td>是</td>
<td>form-data中媒体文件标识,有filename、filelength、content-type等信息</td>
</tr>
</tbody>
</table>
<p><strong>返回说明</strong></p>
<p>正确情况下的返回JSON数据包结果如下:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="19">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;{\&amp;quot;type\&amp;quot;:\&amp;quot;TYPE\&amp;quot;,\&amp;quot;media_id\&amp;quot;:\&amp;quot;MEDIA_ID\&amp;quot;,\&amp;quot;created_at\&amp;quot;:123456789}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">{"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>描述</th></tr>
</thead>
<tbody>
<tr>
<td>type</td>
<td>媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb,主要用于视频与音乐格式的缩略图)</td>
</tr>
<tr>
<td>media_id</td>
<td>媒体文件上传后,获取标识</td>
</tr>
<tr>
<td>created_at</td>
<td>媒体文件上传时间戳</td>
</tr>
</tbody>
</table>
<p>错误情况下的返回JSON数据包示例如下(示例为无效媒体类型错误):</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="18">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;{\&amp;quot;errcode\&amp;quot;:40004,\&amp;quot;errmsg\&amp;quot;:\&amp;quot;invalid media type\&amp;quot;}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">{"errcode":40004,"errmsg":"invalid media type"}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>根据上面的接口,我们定义了一个上传临时素材的方法,包含文件目录和文件类型这两个参数,我们这里依然采用RestTemplate工具类进行文件上传</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="17"><img class="has cke_widget_element lazyload" alt="" width="1200" height="847" src="https://img-blog.csdnimg.cn/20200109133929426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109133929426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;847&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109133929426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="16">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;/**\n   * 上传临时素菜\n   * 1、临时素材media_id是可复用的。\n   * 2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。\n   * 3、上传临时素材的格式、大小限制与公众平台官网一致。\n   * @param filePath\n   * @param type\n   * @return\n   */\n    public String uploadFile(String filePath,String type) {\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if (accessToken != null) {\n            String url = URIConstant.MEDIA_UPLOAD_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;TYPE\&amp;quot;, type);\n            log.info(\&amp;quot;MEDIA_UPLOAD_URL:{}\&amp;quot;,url);\n\n            //设置请求体,注意是LinkedMultiValueMap\n            MultiValueMap&amp;lt;String, Object&amp;gt; form = new LinkedMultiValueMap&amp;lt;&amp;gt;();\n            FileSystemResource fileSystemResource = new FileSystemResource(filePath);\n            form.add(\&amp;quot;media\&amp;quot;, fileSystemResource);\n\n            //设置请求头\n            HttpHeaders headers = new HttpHeaders();\n            headers.setContentType(MediaType.MULTIPART_FORM_DATA);\n\n            //用HttpEntity封装整个请求报文\n            HttpEntity&amp;lt;MultiValueMap&amp;lt;String, Object&amp;gt;&amp;gt; data = new HttpEntity&amp;lt;&amp;gt;(form, headers);\n            try{\n                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因\n                String resultString = restTemplate.postForObject(url, data, String.class);\n                log.info(\&amp;quot;上传返回的信息是:{}\&amp;quot;,resultString);\n                if(!StringUtils.isEmpty(resultString)){\n                  JSONObject jsonObject = JSONObject.parseObject(resultString);\n                  return jsonObject.getString(\&amp;quot;media_id\&amp;quot;);\n                }\n            }catch (Exception e){\n                log.error(e.getMessage());\n            }\n\n      }\n      return null;\n    }&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">/**
   * 上传临时素菜
   * 1、临时素材media_id是可复用的。
   * 2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
   * 3、上传临时素材的格式、大小限制与公众平台官网一致。
   * @param filePath
   * @param type
   * @return
   */
    public String uploadFile(String filePath,String type) {

      String accessToken = accessTokenUtil.getAccessToken();
      if (accessToken != null) {
            String url = URIConstant.MEDIA_UPLOAD_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("TYPE", type);
            log.info("MEDIA_UPLOAD_URL:{}",url);

            //设置请求体,注意是LinkedMultiValueMap
            MultiValueMap&lt;String, Object&gt; form = new LinkedMultiValueMap&lt;&gt;();
            FileSystemResource fileSystemResource = new FileSystemResource(filePath);
            form.add("media", fileSystemResource);

            //设置请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);

            //用HttpEntity封装整个请求报文
            HttpEntity&lt;MultiValueMap&lt;String, Object&gt;&gt; data = new HttpEntity&lt;&gt;(form, headers);
            try{
                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因
                String resultString = restTemplate.postForObject(url, data, String.class);
                log.info("上传返回的信息是:{}",resultString);
                if(!StringUtils.isEmpty(resultString)){
                  JSONObject jsonObject = JSONObject.parseObject(resultString);
                  return jsonObject.getString("media_id");
                }
            }catch (Exception e){
                log.error(e.getMessage());
            }

      }
      return null;
    }</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>我们在swagger中新建一个Controller用以提交我们的上传请求,并测试我们的代码是否正确</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="15"><img class="has cke_widget_element lazyload" alt="" width="1200" height="644" src="https://img-blog.csdnimg.cn/20200109134238928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109134238928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;644&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109134238928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="14">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;@ApiOperation(value = \&amp;quot;上传临时素材\&amp;quot;)\n    @RequestMapping(value = \&amp;quot;/uploadFile\&amp;quot;, method = RequestMethod.POST)\n    @ApiImplicitParams({\n            @ApiImplicitParam(name=\&amp;quot;filePath\&amp;quot;,value=\&amp;quot;文件位置\&amp;quot;, paramType=\&amp;quot;query\&amp;quot;,dataType=\&amp;quot;String\&amp;quot;),\n            @ApiImplicitParam(name=\&amp;quot;type\&amp;quot;,value=\&amp;quot;媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)\&amp;quot;, paramType=\&amp;quot;query\&amp;quot;,dataType=\&amp;quot;String\&amp;quot;),\n\n    })\n    public Object upload(String filePath, String type) throws Exception{\n\n      String result = uploadUtil.uploadFile(filePath,type);\n      return result;\n    }&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">@ApiOperation(value = "上传临时素材")
    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
    @ApiImplicitParams({
            @ApiImplicitParam(name="filePath",value="文件位置", paramType="query",dataType="String"),
            @ApiImplicitParam(name="type",value="媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)", paramType="query",dataType="String"),

    })
    public Object upload(String filePath, String type) throws Exception{

      String result = uploadUtil.uploadFile(filePath,type);
      return result;
    }</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>启动我们的项目,在swagger中输入一个有效的文件路径(这里假如是图片类型),type设置为image</p>
<p>&nbsp;</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="13"><img class="has cke_widget_element lazyload" alt="" width="1200" height="858" src="https://img-blog.csdnimg.cn/20200109134651790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109134651790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;858&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109134651790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>可以看到,我们成功上传了临时文件,并获取到了该文件的media_id(这个后续很重要!!!)</p>
<p>&nbsp;</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="12"><img class="has cke_widget_element lazyload" alt="" width="1200" height="353" src="https://img-blog.csdnimg.cn/20200109134906503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109134906503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;353&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109134906503.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<h3>二、获取临时素材</h3>
<p>临时素材主要分为三类(图片、音频,视频),图片和音频文件支持下载到本地,视频文件支持获取视频的URL地址</p>
<p>(1)获取临时图片</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="11"><img class="has cke_widget_element lazyload" alt="" width="1200" height="789" src="https://img-blog.csdnimg.cn/20200109135321729.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109135321729.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;789&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109135321729.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="10">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;/**\n   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)\n   * 1、如果是图片,则下载图片\n   */\n    public ResponseEntity&amp;lt;byte[]&amp;gt; getImage(String mediaId){\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if(accessToken != null) {\n            String url = URIConstant.MEDIA_GET_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;MEDIA_ID\&amp;quot;, mediaId);\n            log.info(\&amp;quot;MEDIA_GET_URL:{}\&amp;quot;, url);\n\n            String fileName = mediaId+ \&amp;quot;.jpg\&amp;quot;;\n            HttpHeaders headers = new HttpHeaders();\n            try {\n                fileName = new String(fileName.getBytes(\&amp;quot;GBK\&amp;quot;), \&amp;quot;ISO-8859-1\&amp;quot;);\n            } catch (UnsupportedEncodingException e) {\n                e.printStackTrace();\n            }\n            headers.setContentDispositionFormData(\&amp;quot;attachment\&amp;quot;, fileName);// 文件名称\n            ResponseEntity&amp;lt;byte[]&amp;gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&amp;lt;&amp;gt;(headers), byte[].class);\n            return responseEntity;\n      }\n      return null;\n    }&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">/**
   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)
   * 1、如果是图片,则下载图片
   */
    public ResponseEntity&lt;byte[]&gt; getImage(String mediaId){

      String accessToken = accessTokenUtil.getAccessToken();
      if(accessToken != null) {
            String url = URIConstant.MEDIA_GET_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("MEDIA_ID", mediaId);
            log.info("MEDIA_GET_URL:{}", url);

            String fileName = mediaId+ ".jpg";
            HttpHeaders headers = new HttpHeaders();
            try {
                fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            headers.setContentDispositionFormData("attachment", fileName);// 文件名称
            ResponseEntity&lt;byte[]&gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&lt;&gt;(headers), byte[].class);
            return responseEntity;
      }
      return null;
    }</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>(2)获取临时音频</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="9">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;/**\n   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)\n   * 1、如果是声音,则下载声音\n   */\n    public ResponseEntity&amp;lt;byte[]&amp;gt; getVoice(String mediaId){\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if(accessToken != null) {\n            String url = URIConstant.MEDIA_GET_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;MEDIA_ID\&amp;quot;, mediaId);\n            log.info(\&amp;quot;MEDIA_GET_URL:{}\&amp;quot;, url);\n\n            String fileName = mediaId+ \&amp;quot;.speex\&amp;quot;;\n            HttpHeaders headers = new HttpHeaders();\n            try {\n                fileName = new String(fileName.getBytes(\&amp;quot;GBK\&amp;quot;), \&amp;quot;ISO-8859-1\&amp;quot;);\n            } catch (UnsupportedEncodingException e) {\n                e.printStackTrace();\n            }\n            headers.setContentDispositionFormData(\&amp;quot;attachment\&amp;quot;, fileName);// 文件名称\n            ResponseEntity&amp;lt;byte[]&amp;gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&amp;lt;&amp;gt;(headers), byte[].class);\n            return responseEntity;\n      }\n      return null;\n    }&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">/**
   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)
   * 1、如果是声音,则下载声音
   */
    public ResponseEntity&lt;byte[]&gt; getVoice(String mediaId){

      String accessToken = accessTokenUtil.getAccessToken();
      if(accessToken != null) {
            String url = URIConstant.MEDIA_GET_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("MEDIA_ID", mediaId);
            log.info("MEDIA_GET_URL:{}", url);

            String fileName = mediaId+ ".speex";
            HttpHeaders headers = new HttpHeaders();
            try {
                fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            headers.setContentDispositionFormData("attachment", fileName);// 文件名称
            ResponseEntity&lt;byte[]&gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&lt;&gt;(headers), byte[].class);
            return responseEntity;
      }
      return null;
    }</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>&nbsp;(3)获取视频素材地址</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="8">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;/**\n   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)\n   * 2、如果是视频,则返回视频的地址\n   */\n    public String getVedio(String mediaId){\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if(accessToken != null) {\n            String url = URIConstant.MEDIA_GET_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;MEDIA_ID\&amp;quot;, mediaId);\n            log.info(\&amp;quot;MEDIA_GET_URL:{}\&amp;quot;, url);\n\n            String responseString = restTemplate.getForObject(url,String.class);\n            return responseString;\n      }\n      return null;\n    }&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">/**
   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)
   * 2、如果是视频,则返回视频的地址
   */
    public String getVedio(String mediaId){

      String accessToken = accessTokenUtil.getAccessToken();
      if(accessToken != null) {
            String url = URIConstant.MEDIA_GET_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("MEDIA_ID", mediaId);
            log.info("MEDIA_GET_URL:{}", url);

            String responseString = restTemplate.getForObject(url,String.class);
            return responseString;
      }
      return null;
    }</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<h3>&nbsp;三、测试</h3>
<p>这里我们仅以上传临时图片素材并下载临时图片素材为例,我们在我们的Controller中新增一个根据media_id获取临时图片类型素材的方法</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="7"><img class="has cke_widget_element lazyload" alt="" width="1200" height="532" src="https://img-blog.csdnimg.cn/2020010914015252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/2020010914015252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;532&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/2020010914015252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>我们把我们刚才上传临时素材成功返回的media_id传给我们的方法</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="6"><img class="has cke_widget_element lazyload" alt="" width="1200" height="645" src="https://img-blog.csdnimg.cn/20200109140238546.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109140238546.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;645&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109140238546.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;</p>
<p>可以看到我们的swagger返回带有Download file的超级链接,点击即可下载我们的图片,当然我们可以直接在浏览器直接输入我们的完整请求地址</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="5">
<pre class="cke_widget_element has" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;http://localhost/material/getFile?mediaId=C3Vd7uR-MKY5bOkyT5hWGaS-icl3av7GahjM9E9Hx9i8nonxg4PNtE-s7TbYSseV&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">http://localhost/material/getFile?mediaId=C3Vd7uR-MKY5bOkyT5hWGaS-icl3av7GahjM9E9Hx9i8nonxg4PNtE-s7TbYSseV</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="4"><img class="has cke_widget_element lazyload" alt="" width="1200" height="767" src="https://img-blog.csdnimg.cn/20200109140453175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109140453175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;767&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109140453175.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>点击这个Download File,我们成功的下载到这个上传的临时图片</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="3"><img class="has cke_widget_element lazyload" alt="" width="1200" height="785" src="https://img-blog.csdnimg.cn/20200109140551121.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109140551121.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;785&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109140551121.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​&nbsp;试着打开这个文件,我们可以看到,这个确实是我们上传的图片</span></span></span></p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="2"><img class="has cke_widget_element lazyload" alt="" width="1200" height="1009" src="https://img-blog.csdnimg.cn/20200109140635851.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;quot;https://img-blog.csdnimg.cn/20200109140635851.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;1009&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200109140635851.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸">​</span></span></span></p>
<p>&nbsp;这里贴出完整的代码,自行修改以获得其他类型的临时文件,不做赘述</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="1">
<pre class="cke_widget_element has" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;UploadUtil.java&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">UploadUtil.java</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="0">
<pre class="cke_widget_element has" data-cke-widget-data="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;package com.xu.wemall.components.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.constants.URIConstant;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.core.io.FileSystemResource;\nimport org.springframework.http.*;\nimport org.springframework.stereotype.Component;\nimport org.springframework.util.LinkedMultiValueMap;\nimport org.springframework.util.MultiValueMap;\nimport org.springframework.util.StringUtils;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.io.UnsupportedEncodingException;\n\n/**\n * 功能:临时素材工具类\n */\n@Slf4j\n@Component\npublic class UploadUtil {\n\n    @Autowired\n    private RestTemplate restTemplate;\n\n    @Autowired\n    private AccessTokenUtil accessTokenUtil;\n\n    /**\n   * 上传临时素菜\n   * 1、临时素材media_id是可复用的。\n   * 2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。\n   * 3、上传临时素材的格式、大小限制与公众平台官网一致。\n   * @param filePath\n   * @param type\n   * @return\n   */\n    public String uploadFile(String filePath,String type) {\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if (accessToken != null) {\n            String url = URIConstant.MEDIA_UPLOAD_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;TYPE\&amp;quot;, type);\n            log.info(\&amp;quot;MEDIA_UPLOAD_URL:{}\&amp;quot;,url);\n\n            //设置请求体,注意是LinkedMultiValueMap\n            MultiValueMap&amp;lt;String, Object&amp;gt; form = new LinkedMultiValueMap&amp;lt;&amp;gt;();\n            FileSystemResource fileSystemResource = new FileSystemResource(filePath);\n            form.add(\&amp;quot;media\&amp;quot;, fileSystemResource);\n\n            //设置请求头\n            HttpHeaders headers = new HttpHeaders();\n            headers.setContentType(MediaType.MULTIPART_FORM_DATA);\n\n            //用HttpEntity封装整个请求报文\n            HttpEntity&amp;lt;MultiValueMap&amp;lt;String, Object&amp;gt;&amp;gt; data = new HttpEntity&amp;lt;&amp;gt;(form, headers);\n            try{\n                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因\n                String resultString = restTemplate.postForObject(url, data, String.class);\n                log.info(\&amp;quot;上传返回的信息是:{}\&amp;quot;,resultString);\n                if(!StringUtils.isEmpty(resultString)){\n                  JSONObject jsonObject = JSONObject.parseObject(resultString);\n                  return jsonObject.getString(\&amp;quot;media_id\&amp;quot;);\n                }\n            }catch (Exception e){\n                log.error(e.getMessage());\n            }\n\n      }\n      return null;\n    }\n\n    /**\n   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)\n   * 1、如果是图片,则下载图片\n   */\n    public ResponseEntity&amp;lt;byte[]&amp;gt; getImage(String mediaId){\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if(accessToken != null) {\n            String url = URIConstant.MEDIA_GET_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;MEDIA_ID\&amp;quot;, mediaId);\n            log.info(\&amp;quot;MEDIA_GET_URL:{}\&amp;quot;, url);\n\n            String fileName = mediaId+ \&amp;quot;.jpg\&amp;quot;;\n            HttpHeaders headers = new HttpHeaders();\n            try {\n                fileName = new String(fileName.getBytes(\&amp;quot;GBK\&amp;quot;), \&amp;quot;ISO-8859-1\&amp;quot;);\n            } catch (UnsupportedEncodingException e) {\n                e.printStackTrace();\n            }\n            headers.setContentDispositionFormData(\&amp;quot;attachment\&amp;quot;, fileName);// 文件名称\n            ResponseEntity&amp;lt;byte[]&amp;gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&amp;lt;&amp;gt;(headers), byte[].class);\n            return responseEntity;\n      }\n      return null;\n    }\n\n    /**\n   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)\n   * 1、如果是声音,则下载声音\n   */\n    public ResponseEntity&amp;lt;byte[]&amp;gt; getVoice(String mediaId){\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if(accessToken != null) {\n            String url = URIConstant.MEDIA_GET_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;MEDIA_ID\&amp;quot;, mediaId);\n            log.info(\&amp;quot;MEDIA_GET_URL:{}\&amp;quot;, url);\n\n            String fileName = mediaId+ \&amp;quot;.speex\&amp;quot;;\n            HttpHeaders headers = new HttpHeaders();\n            try {\n                fileName = new String(fileName.getBytes(\&amp;quot;GBK\&amp;quot;), \&amp;quot;ISO-8859-1\&amp;quot;);\n            } catch (UnsupportedEncodingException e) {\n                e.printStackTrace();\n            }\n            headers.setContentDispositionFormData(\&amp;quot;attachment\&amp;quot;, fileName);// 文件名称\n            ResponseEntity&amp;lt;byte[]&amp;gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&amp;lt;&amp;gt;(headers), byte[].class);\n            return responseEntity;\n      }\n      return null;\n    }\n\n    /**\n   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)\n   * 2、如果是视频,则返回视频的地址\n   */\n    public String getVedio(String mediaId){\n\n      String accessToken = accessTokenUtil.getAccessToken();\n      if(accessToken != null) {\n            String url = URIConstant.MEDIA_GET_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;MEDIA_ID\&amp;quot;, mediaId);\n            log.info(\&amp;quot;MEDIA_GET_URL:{}\&amp;quot;, url);\n\n            String responseString = restTemplate.getForObject(url,String.class);\n            return responseString;\n      }\n      return null;\n    }\n\n\n\n}\n\n\n&amp;quot;,&amp;quot;classes&amp;quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.components.weixin;

import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.constants.URIConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;

/**
* 功能:临时素材工具类
*/
@Slf4j
@Component
public class UploadUtil {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private AccessTokenUtil accessTokenUtil;

    /**
   * 上传临时素菜
   * 1、临时素材media_id是可复用的。
   * 2、媒体文件在微信后台保存时间为3天,即3天后media_id失效。
   * 3、上传临时素材的格式、大小限制与公众平台官网一致。
   * @param filePath
   * @param type
   * @return
   */
    public String uploadFile(String filePath,String type) {

      String accessToken = accessTokenUtil.getAccessToken();
      if (accessToken != null) {
            String url = URIConstant.MEDIA_UPLOAD_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("TYPE", type);
            log.info("MEDIA_UPLOAD_URL:{}",url);

            //设置请求体,注意是LinkedMultiValueMap
            MultiValueMap&lt;String, Object&gt; form = new LinkedMultiValueMap&lt;&gt;();
            FileSystemResource fileSystemResource = new FileSystemResource(filePath);
            form.add("media", fileSystemResource);

            //设置请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);

            //用HttpEntity封装整个请求报文
            HttpEntity&lt;MultiValueMap&lt;String, Object&gt;&gt; data = new HttpEntity&lt;&gt;(form, headers);
            try{
                //这里RestTemplate请求返回的字符串直接转换成JSONObject会报异常,后续深入找一下原因
                String resultString = restTemplate.postForObject(url, data, String.class);
                log.info("上传返回的信息是:{}",resultString);
                if(!StringUtils.isEmpty(resultString)){
                  JSONObject jsonObject = JSONObject.parseObject(resultString);
                  return jsonObject.getString("media_id");
                }
            }catch (Exception e){
                log.error(e.getMessage());
            }

      }
      return null;
    }

    /**
   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)
   * 1、如果是图片,则下载图片
   */
    public ResponseEntity&lt;byte[]&gt; getImage(String mediaId){

      String accessToken = accessTokenUtil.getAccessToken();
      if(accessToken != null) {
            String url = URIConstant.MEDIA_GET_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("MEDIA_ID", mediaId);
            log.info("MEDIA_GET_URL:{}", url);

            String fileName = mediaId+ ".jpg";
            HttpHeaders headers = new HttpHeaders();
            try {
                fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            headers.setContentDispositionFormData("attachment", fileName);// 文件名称
            ResponseEntity&lt;byte[]&gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&lt;&gt;(headers), byte[].class);
            return responseEntity;
      }
      return null;
    }

    /**
   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)
   * 1、如果是声音,则下载声音
   */
    public ResponseEntity&lt;byte[]&gt; getVoice(String mediaId){

      String accessToken = accessTokenUtil.getAccessToken();
      if(accessToken != null) {
            String url = URIConstant.MEDIA_GET_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("MEDIA_ID", mediaId);
            log.info("MEDIA_GET_URL:{}", url);

            String fileName = mediaId+ ".speex";
            HttpHeaders headers = new HttpHeaders();
            try {
                fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            headers.setContentDispositionFormData("attachment", fileName);// 文件名称
            ResponseEntity&lt;byte[]&gt; responseEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity&lt;&gt;(headers), byte[].class);
            return responseEntity;
      }
      return null;
    }

    /**
   * 公众号可以使用本接口获取临时素材(即下载临时的多媒体文件)
   * 2、如果是视频,则返回视频的地址
   */
    public String getVedio(String mediaId){

      String accessToken = accessTokenUtil.getAccessToken();
      if(accessToken != null) {
            String url = URIConstant.MEDIA_GET_URL.replace("ACCESS_TOKEN", accessToken)
                  .replace("MEDIA_ID", mediaId);
            log.info("MEDIA_GET_URL:{}", url);

            String responseString = restTemplate.getForObject(url,String.class);
            return responseString;
      }
      return null;
    }



}


</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>谢谢各位,我们下回继续再说!</p>
<h3>如果您觉得此文有帮助,可以小小打赏一下,持续更新更有动力哟!</h3>
<p><img alt="" width="218" height="274" data-src="https://img2020.cnblogs.com/blog/1501920/202004/1501920-20200402133129576-79870337.png"><img src="https://img2020.cnblogs.com/blog/1501920/202004/1501920-20200402133221455-2112921293.png"></p><br><br>
来源:https://www.cnblogs.com/xulijun137/p/12213629.html
頁: [1]
查看完整版本: 微信公众号开发之新增临时素材(八)