前言
很多时候,我们需要异步上传图片到微信服务器的,比如我们在本地网站添加一篇文章的时候,如果文章里面带有图片,那么这个时候我们就需要事先上传好图片到微信服务器,然后用返回来的图片url替换上图片地址,否则如果使用我们系统的域名的图片,微信图文会显示不了的,微信图文消息只支持内部url下面的图片,也就是如果我们的图片比如是www.bamn.cn/abc.png那么这样的图片虽然我们本网站肯定是可以访问的,但是在微信客户端下面访问图文消息是无法显示的,估计微信是担心图片不安全问题,比如带有色情 反动等图片,上传到微信服务器他们可以审核图片是否合格
首先先上传图片到我们本地系统
当然我们可以直接post图片到微信服务器,也就是从客户端本地浏览器直接上传到微信服务器,但是这样就不方便异步上传了,所以我们这里先上传到我们网站的服务器,然后再服务器端完成图片上传到微信服务器
下面是aspx页面,就是一个form表单,上传图片
发送图文消息中的图片
后台事件触发哪里,将图片先保存到服务器
具体流程
1 用户通过浏览器选择图片
2 上传本地图片到网站服务器
3 网站服务器通过webclient提交图片到微信服务器
4 成功上传到微信服务器后 返回
5 解析返回的json 替换浏览器的图片地址
protected void Button1_Click(object sender, EventArgs e)
{
Access_token_info obj = GetTokenInfo(); string uploadUrl = string.Format( "http://api.weixin.qq.com/cgi-bin/material/add_material?access_token={0}&type={1}",
obj.access_token, "image");
WebClient wxUpload = new WebClient(); string uploadPath = "~/Images/"; string folder = Server.MapPath(uploadPath); //自动创建目录 if (!Directory.Exists(folder))
{
Directory.CreateDirectory(folder);
}
HttpPostedFile file = Request.Files.Get(0); string filename = folder + file.FileName;
file.SaveAs(filename); //API所需的媒体信息 wxUpload.Headers.Add("Content-Type", this.ContentType); // 所有表单数据 ArrayList bytesArray = new ArrayList(); // 普通表单 bytesArray.Add(CreateFieldData("jsonDataStr", "")); // 读文件流 FileStream fs = new FileStream(filename, FileMode.Open,
FileAccess.Read, FileShare.Read); string ContentType = "application/octet-stream"; byte[] fileBytes = new byte[fs.Length];
fs.Read(fileBytes, 0, Convert.ToInt32(fs.Length)); // 文件表单 bytesArray.Add(CreateFieldData("media", file.FileName, ContentType, fileBytes)); // 合成所有表单并生成二进制数组 byte[] bytes = JoinBytes(bytesArray); byte[] result = wxUpload.UploadData(uploadUrl, bytes); string resultjson = Encoding.UTF8.GetString(result); //在这里获取json数据,获得图片URL }
然后调用wxUpload.UploadData
方法进行图片上传到微信服务器,当然我们上传前需要,封装二进制byte[],下面方法是从网站找到的,现在贴出来,都是上面事件用到/**/
///
/// 获取普通表单区域二进制数组 ///
/// 表单名
/// 表单值
///
///
/// -----------------------------7d52ee27210a3c\r\nContent-Disposition: form-data; name=\"表单名\"\r\n\r\n表单值\r\n /// public byte[] CreateFieldData(string fieldName, string fieldValue)
{ string textTemplate = Boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n"; string text = String.Format(textTemplate, fieldName, fieldValue); byte[] bytes = encoding.GetBytes(text); return bytes;
} public string Boundary
{ get
{ string[] bArray, ctArray; string contentType = ContentType;
ctArray = contentType.Split(';'); if (ctArray[0].Trim().ToLower() == "multipart/form-data")
{
bArray = ctArray[1].Split('='); return "--" + bArray[1];
} return null;
}
} public new string ContentType
{ get
{ if (HttpContext.Current == null)
{ return "multipart/form-data; boundary=---------------------------7d5b915500cee";
} return HttpContext.Current.Request.ContentType;
}
} /**/
///
/// 获取文件上传表单区域二进制数组 ///
/// 表单名
/// 文件名
/// 文件类型
/// 文件长度
/// 文件流
/// 二进制数组 public byte[] CreateFieldData(string fieldName, string filename, string contentType, byte[] fileBytes)
{ string end = "\r\n"; string textTemplate = Boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; // 头数据 string data = String.Format(textTemplate, fieldName, filename, contentType); byte[] bytes = encoding.GetBytes(data); // 尾数据 byte[] endBytes = encoding.GetBytes(end); // 合成后的数组 byte[] fieldData = new byte[bytes.Length + fileBytes.Length + endBytes.Length];
bytes.CopyTo(fieldData, 0); // 头数据 fileBytes.CopyTo(fieldData, bytes.Length); // 文件的二进制数据 endBytes.CopyTo(fieldData, bytes.Length + fileBytes.Length); // \r\n return fieldData;
} /**/
///
/// 拼接所有的二进制数组为一个数组 ///
/// 数组
///
/// 加上结束边界 public byte[] JoinBytes(ArrayList byteArrays)
{ int length = 0; int readLength = 0; // 加上结束边界 string endBoundary = Boundary + "--\r\n"; //结束边界 byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);
byteArrays.Add(endBoundaryBytes); foreach (byte[] b in byteArrays)
{
length += b.Length;
} byte[] bytes = new byte[length]; // 遍历复制 foreach (byte[] b in byteArrays)
{
b.CopyTo(bytes, readLength);
readLength += b.Length;
} return bytes;
}
这样,我们提交后,就能到到微信服务器返回的json
{"media_id":"7iaof6bshgjnU51HGppLtHRFxJlrfpevubIf4cWf-Cw","url":"http:\/\/mmbiz.qpic.cn\/mmbiz_png\/ygWL2F9vQfghvDGLwqVn8AibDIlYBKqOiak7mpuG4pLyia
6Aia5Fn4yjxEp9iaPv63sQjibCISibfRdTbzcOzg4jZCNew\/0?wx_fmt=png"}
有了这个json后,我们就可以得到图片的url了,只需要替换图文消息中的图片地址就可以了,只有这样我们的图片才能显示在图文内容文章中