springboot的微信公众号(八)新增素材

124 阅读2分钟

在上一篇中我们有一个发送图片消息的实例中需要上传素材到微信服务器,这节我们一起来看一下这个如何上传素材

之前我们说到,素材分为永久和临时,接口肯定不一样,参数也不一样,永久素材是有上限的

我这里写的是临时素材

post请求,上传一个多媒体文件到微信服务器即可

代码如下:

/**
	 * 文件上传的方法
	 * @param filePath 绝对路径
	 * @param fileType 文件类型
	 * @return
	 */
	public static String upload(String filePath,String fileType){
		String result=null;
		String mediaId=null;
		File file=new File(filePath);
		try {
			if(!file.exists()||!file.isFile()){
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		try {
			String  token=WeiXinUtil.getAccessToken();
			String urlString=ADD_FILE_TEMPORARY.replace("ACCESS_TOKEN", token).replace("TYPE", fileType);
			URL url=new URL(urlString);
			HttpsURLConnection conn=(HttpsURLConnection) url.openConnection();
			conn.setRequestMethod("POST");//以POST方式提交表单
			conn.setDoInput(true);
			conn.setDoOutput(true);
			conn.setUseCaches(false);//POST方式不能使用缓存
			//设置请求头信息
			conn.setRequestProperty("Connection", "Keep-Alive");
			conn.setRequestProperty("Charset", "UTF-8");
			//设置边界
			String BOUNDARY="----------"+System.currentTimeMillis();
			conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
			//请求正文信息
			//第一部分
			StringBuilder sb=new StringBuilder();
			sb.append("--");//必须多两条道
			sb.append(BOUNDARY);
			sb.append("\r\n");
			sb.append("Content-Disposition: form-data;name=\"media\"; filename=\"" + file.getName()+"\"\r\n");
			sb.append("Content-Type:application/octet-stream\r\n\r\n");
			System.out.println("sb:"+sb);

			//获得输出流
			OutputStream out=new DataOutputStream(conn.getOutputStream());
			//输出表头
			out.write(sb.toString().getBytes("UTF-8"));
			//文件正文部分
			//把文件以流的方式 推送道URL中
			DataInputStream din=new DataInputStream(new FileInputStream(file));
			int bytes=0;
			byte[] buffer=new byte[1024];
			while((bytes=din.read(buffer))!=-1){
				out.write(buffer,0,bytes);
			}
			din.close();
			//结尾部分
			byte[] foot=("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");//定义数据最后分割线
			out.write(foot);
			out.flush();
			out.close();
			if(HttpsURLConnection.HTTP_OK==conn.getResponseCode()){

				StringBuffer strbuffer=null;
				BufferedReader reader=null;
				try {
					strbuffer=new StringBuffer();
					reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
					String lineString=null;
					while((lineString=reader.readLine())!=null){
						strbuffer.append(lineString);

					}
					if(result==null){
						result=strbuffer.toString();
						logger.info("result:"+result);
						/**
						 * 这里的缩略图和image是不一样的,你们可以试一下
						 * 
						 *
						 */
						JSONObject jsonObj = JSONObject.fromObject(result);
						System.out.println(jsonObj);
						String typeName = "media_id";
						if(!"image".equals(fileType)){
							typeName = fileType + "_media_id";
						}
						mediaId = jsonObj.getString(typeName);
					}
				} catch (IOException e) {
					logger.error("发送POST请求出现异常!",e);
					e.printStackTrace();
				}finally{
					if(reader!=null){
						reader.close();
					}
				}

			}
		}  catch (IOException e) {
			e.printStackTrace();
		}
		return mediaId;
	}

这里面一个比较坑的地方,我自己没有看清楚

注意这里的限制,还有代码中的注释也有说明,有兴趣的可以试一下

我这里成功后返回的数据

这里我处理了一下,让他返回mediaid了,你也可以返回result,一样的

调用的代码: