需求:
关注公众号自动回复图片,但是图片又存储在oss,所以这个时候需要将网络图片直接转化为临时素材。
思路:
将图片先转成文件流,然后通过上传临时素材接口上传。而大部分的思路都是将服务器本地的文件上传到临时素材。
成果:
开发:
/**
* @param fileUrl 文件的访问链接
* @param fileType "image"
* @return
* @throws Exception
*/
public JSONObject uploadTempMedia(String fileUrl, String fileType) throws Exception{
String accessToken = getWeChatAccessToken();
String urlString = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" + accessToken + "&type=" + fileType;
//返回结果
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
// 获取网络图片
URL mediaUrl = new URL(fileUrl);
HttpURLConnection meidaConn = (HttpURLConnection) mediaUrl.openConnection();
meidaConn.setDoOutput(true);
meidaConn.setRequestMethod("GET");
String result = null;
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=\"" + fileName+"\"\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(meidaConn.getInputStream());
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();
System.out.println("result:"+result);
}
} catch (IOException e) {
System.out.println("发送POST请求出现异常!"+e);
e.printStackTrace();
}finally{
if(reader!=null){
reader.close();
}
}
}
JSONObject jsonObject=JSONObject.parseObject(result);
return jsonObject;
}