下载微信文件图片音频视频并上传到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";
    }
View Code

 

上传阿里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;
        }

附:

安装ffmpeg教程

ffmpeg转换命令教程

 

posted @ 2022-09-07 13:54  清风神剑  阅读(185)  评论(0编辑  收藏  举报