下载微信文件图片音频视频并上传到OSS
需求背景:企业微信的文件图片音频视频都需要在本系统,不能放微信存着
框架:.NET6
系统:Windows10,WindowsServer2016
微信消息类型枚举类
/// <summary> /// 微信消息类型枚举 /// </summary> public static class WechatMsgTypeEnum { /// <summary> /// 文本消息 /// </summary> public const string Text = "text"; /// <summary> /// 图片消息 /// </summary> public const string Image = "image"; /// <summary> /// 语音消息 /// </summary> public const string Voice = "voice"; /// <summary> /// 视频消息 /// </summary> public const string Video = "video"; /// <summary> /// 文件消息 /// </summary> public const string File = "file"; /// <summary> /// 位置消息 /// </summary> public const string Location = "location"; /// <summary> /// 链接消息 /// </summary> public const string Link = "link"; /// <summary> /// 名片消息 /// </summary> public const string Business_Card = "business_card"; /// <summary> /// 小程序消息 /// </summary> public const string MiniProgram = "miniprogram"; /// <summary> /// 菜单消息 /// </summary> public const string MsgMenu = "msgmenu"; /// <summary> /// 事件消息 /// </summary> public const string Event = "event"; }
上传阿里OSS SDK,用nuget安装即可
Aliyun.OSS.SDK.NetCore
Aliyun.Acs.Sts
具体上传代码
downloadUrl 是微信素材url
downloadUrl :https://qyapi.weixin.qq.com/cgi-bin/media/get?access_token=xxx&media_id=xxxx
理论上换成任何网络地址都可以
result.Content.Headers.ContentDisposition.FileNameStar
有名字即可
private static OssClient client = new OssClient(endpoint, accessKeyId, accessKeySecret); /// <summary> /// 获取微信文件上传到OSS /// </summary> /// <param name="downloadUrl"></param> /// <returns></returns> public string UploadWechatFileToOss(string downloadUrl, string msgType) { _logger.LogDebug(downloadUrl); switch (msgType) { case WechatMsgTypeEnum.Image: return UploadWechatFileToOssImage(downloadUrl); case WechatMsgTypeEnum.File: return UploadWechatFileToOssFile(downloadUrl); case WechatMsgTypeEnum.Voice: return UploadWechatFileToOssVoice(downloadUrl); case WechatMsgTypeEnum.Video: return UploadWechatFileToOssVideo(downloadUrl); default: return "unkown " + downloadUrl; } } /// <summary> /// 上传图片 /// </summary> /// <param name="downloadUrl"></param> /// <returns></returns> private string UploadWechatFileToOssImage(string downloadUrl) { HttpClient web = new HttpClient();//先下载网络图片到内存 var result = web.GetAsync(downloadUrl).Result; string fileName = result.Content.Headers.ContentDisposition.FileNameStar; string ext = Path.GetExtension(fileName).Replace("/", ""); string fullPath = $"Wechat/{ext}/{DateTime.Now.ToString("yyyy-MM-dd")}/{Guid.NewGuid().ToString()}/{fileName}"; var fs = result.Content.ReadAsStream(); client.PutObject(bucketName, fullPath, fs); return fullPath; } /// <summary> /// 上传文件 /// </summary> /// <param name="downloadUrl"></param> /// <returns></returns> private string UploadWechatFileToOssFile(string downloadUrl) { HttpClient web = new HttpClient();//先下载网络图片到内存 var result = web.GetAsync(downloadUrl).Result; string fileName = result.Content.Headers.ContentDisposition.FileNameStar; fileName = HttpUtility.UrlDecode(fileName); string ext = Path.GetExtension(fileName).Replace("/", ""); string fullPath = $"Wechat/{ext}/{DateTime.Now.ToString("yyyy-MM-dd")}/{Guid.NewGuid().ToString()}/{fileName}"; var fs = result.Content.ReadAsStream(); client.PutObject(bucketName, fullPath, fs); return fullPath; } /// <summary> /// 上传音频 /// </summary> /// <param name="downloadUrl"></param> /// <returns></returns> private string UploadWechatFileToOssVoice(string downloadUrl) { try { HttpClient web = new HttpClient(); var result = web.GetAsync(downloadUrl).Result; var fs = result.Content.ReadAsStream(); var rn = Guid.NewGuid().ToString(); var fileName = rn + ".amr"; var savePath = "WechatFile/" + fileName; using (FileStream ffs = new FileStream(savePath, FileMode.CreateNew)) { byte[] buffer = new byte[fs.Length]; int readLength = 0; int length; while ((length = fs.Read(buffer, 0, buffer.Length)) != 0) { readLength += length; // 写入到文件 ffs.Write(buffer, 0, length); } } // 由于html5不能直接播放amr,所以用ffmpeg转换成mp3 fileName = rn + ".mp3"; var mp3path = "WechatFile/" + fileName; var cmdString = $"ffmpeg -i {savePath} {mp3path}"; Process cmdProcess = new Process(); cmdProcess.StartInfo.FileName = "cmd.exe"; cmdProcess.StartInfo.RedirectStandardInput = true;//是否可以输入 cmdProcess.StartInfo.RedirectStandardOutput = true;//是否可以输出 cmdProcess.StartInfo.CreateNoWindow = true; cmdProcess.Start();//执行 cmdProcess.StandardInput.WriteLine(cmdString); //向cmd窗口发送输入信息 cmdProcess.StandardInput.WriteLine("&exit");//要退出 cmdProcess.StandardInput.AutoFlush = true; //提交 string results = cmdProcess.StandardOutput.ReadToEnd();//输出 cmdProcess.WaitForExit();//等待程序执行完退出进程 cmdProcess.Close();//结束 string fullPath = $"Wechat/mp3/{DateTime.Now.ToString("yyyy-MM-dd")}/{fileName}"; using (FileStream fsss = new FileStream(mp3path, FileMode.Open)) { client.PutObject(bucketName, fullPath, fsss); } System.IO.File.Delete(savePath); System.IO.File.Delete(mp3path); return fullPath; } catch (Exception ex) { _logger.LogError(ex, ex.Message, downloadUrl); return ex.Message + downloadUrl; } } /// <summary> /// 上传视频 /// </summary> /// <param name="downloadUrl"></param> /// <returns></returns> private string UploadWechatFileToOssVideo(string downloadUrl) { HttpClient web = new HttpClient();//先下载网络图片到内存 var result = web.GetAsync(downloadUrl).Result; var rn = Guid.NewGuid().ToString(); var fileName = rn + ".mp4"; string fullPath = $"Wechat/mp4/{DateTime.Now.ToString("yyyy-MM-dd")}/{fileName}"; var fs = result.Content.ReadAsStream(); client.PutObject(bucketName, fullPath, fs); return fullPath; }
附: