判断mediaUrl是本地路径还是网络路径 if(mediaUrl.startsWith("http")){ URL url2 = new URL(mediaUrl); HttpURLConnection conn2 = (HttpURLConnection) url2.openConnection(); conn2.setDoInput(true); conn2.setRequestMethod("GET"); BufferedInputStream bis = new BufferedInputStream(conn2.getInputStream()); while((len = bis.read(buf))>0){out.write(buf,0, len); } bis.close(); conn2.disconnect(); }else{ //将请求消息体的正文写入conn的写入流out中DataInputStreamin = new DataInputStream(new FileInputStream(mediaUrl)); while((len =in.read(buf))>0){out.write(buf,0,len); }in.close();//关闭流 } System.out.println("文件写入完成 ..."); //拼接请求消息体的格式尾 StringBuilder sb2 = new StringBuilder(); sb2.append("\r\n");//回车 - 请求消息体的正文和格式头、格式尾分别隔着一个空行 sb2.append("--"); sb2.append(boundary); sb2.append("--"); sb2.append("\r\n");//回车 byte[] foot = sb2.toString().getBytes("UTF-8"); //System.out.println(foot); //将请求消息体的格式尾写入out流out.write(foot);out.flush();out.close(); System.out.println("上传多媒体请求消息发出 ..."); //读取服务器响应的消息 StringBuffer temp = new StringBuffer(); InputStream respIn = conn.getInputStream(); len =0; while((len = respIn.read(buf))>0){ temp.append(new String(buf,0,len)); } respIn.close(); conn.disconnect(); result = temp.toString(); } catch (IOException e) { System.out.println("发送POST请求出现异常!" + e); e.printStackTrace(); } System.out.println("微信服务器回复的消息:" + result); JSONObject json = JSONObject.fromObject(result); //组装WeiXinMedia WeiXinMedia wxMedia = new WeiXinMedia(); wxMedia.setType(json.getString("type")); wxMedia.setMedia_id(json.getString("media_id")); wxMedia.setCreated_at(json.getInt("created_at")); return wxMedia; } }
WeiXinMedia的代码如下:
publicclass WeiXinMedia {private String type;private String media_id;privateint created_at;//省略setter和getter
如果对其中的上传文件的http消息格式不明白,可以参考:
说了半天,故事才开始
有了MediaUtil那我还不大干一场,在CoreService类中
Image image = new Image(); image.setMediaId(MediaUtil.uploadMedia(access_token,"image","c:/1.png").getMedia_id()); ImageRespMessage imageRespMessage = new ImageRespMessage(); imageRespMessage.setToUserName(fromUserName); imageRespMessage.setFromUserName(toUserName); imageRespMessage.setCreateTime(new Date().getTime()); imageRespMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_IMAGE); imageRespMessage.setImage(image); respXml = MessageUtil.respMessage2Xml(imageRespMessage);
Image类中只有一个属性media_id,有图有真相
publicclass Image {public String MediaId;//setter和getter }
ImageRespMessage代码如下:
publicclassImageRespMessageextendsBaseRespMessage {private Image image;//setter和getter }
然后就运行嘛,试几次都是“该公众号暂时无法提供服务,请稍后再试”这样的系统提示,我就纳闷了,怎么是我文件没上传成功,在”使用网页调试工具调试该接口”中测试了一下,图片妥妥的传给了微信服务器,证明access_token和media_id是有效的,那为什么还有系统提示呢?
请开发者注意,一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:
1、开发者在5秒内未回复任何内容
2、开发者回复了异常数据,比如JSON数据等