微信图片数据网方服务器上有,5-10节 异步上传永久素材图片到微信服务器和返回图片地址...

前言

很多时候,我们需要异步上传图片到微信服务器的,比如我们在本地网站添加一篇文章的时候,如果文章里面带有图片,那么这个时候我们就需要事先上传好图片到微信服务器,然后用返回来的图片url替换上图片地址,否则如果使用我们系统的域名的图片,微信图文会显示不了的,微信图文消息只支持内部url下面的图片,也就是如果我们的图片比如是www.bamn.cn/abc.png那么这样的图片虽然我们本网站肯定是可以访问的,但是在微信客户端下面访问图文消息是无法显示的,估计微信是担心图片不安全问题,比如带有色情 反动等图片,上传到微信服务器他们可以审核图片是否合格

首先先上传图片到我们本地系统

当然我们可以直接post图片到微信服务器,也就是从客户端本地浏览器直接上传到微信服务器,但是这样就不方便异步上传了,所以我们这里先上传到我们网站的服务器,然后再服务器端完成图片上传到微信服务器

下面是aspx页面,就是一个form表单,上传图片

发送图文消息中的图片

后台事件触发哪里,将图片先保存到服务器

具体流程

1 用户通过浏览器选择图片

2 上传本地图片到网站服务器

3 网站服务器通过webclient提交图片到微信服务器

4 成功上传到微信服务器后 返回

5 解析返回的json 替换浏览器的图片地址

161128034020B06404HXHRB82NL.pngprotected 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了,只需要替换图文消息中的图片地址就可以了,只有这样我们的图片才能显示在图文内容文章中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值