今天在测试同事的微信平台的发送语音的时候,发现有时候语音能发过来,有时候就不行,经过检查,发现丢掉了检测音频时长(微信里面语言时长要限定在60S内),好吧,我补上,闲着也是闲着~
首先是读取语音的时长:
<span style="font-size:14px;"> /// <summary> /// 获取上传音频的时间长度 /// </summary> /// <param name="strFullUrl">The STR full URL.</param> /// <returns>System.String.</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/5/15 17:32:57</remarks> public string GetLocalVoiceTotalTime(string strFullUrl) { ShellClass sh = new ShellClass(); Folder dir = sh.NameSpace(Path.GetDirectoryName(strFullUrl)); FolderItem item = dir.ParseName(Path.GetFileName(strFullUrl)); return dir.GetDetailsOf(item, 27); // 获取歌曲时长。 }</span>
使用shellclass的时候要先引用COM组件Microsoft Shell Controls And Automation,并将Embed Interop Type 设为False。
由于上述函数只支持读取本地文件,所以,我们将得到的文件先放在临时文件夹中,判断完成之后立即删除。
<span style="font-size:14px;">/// <summary> /// 检查上传音频文件的总时间长度是否小于60s /// </summary> /// <param name="file">The file.</param> /// <returns><c>true</c> if XXXX, <c>false</c> otherwise</returns> /// <remarks>Editor:v-liuhch CreateTime:2015/5/15 17:34:51</remarks> public bool ChkVideoTotalTime(HttpPostedFile file) { string strTempUrl = Path.GetTempPath() + DateTime.Now.ToString("yyyyMMddHHmmssfff").ToString() + Path.GetExtension(file.FileName); file.SaveAs(strTempUrl);//保存到本地临时文件夹 try { string strTotalTime = GetLocalVoiceTotalTime(strTempUrl); //获取文件时长 return (Convert.ToDateTime(strTotalTime) - Convert.ToDateTime("00:01:00")).Seconds > 0 ? false : true; } catch (Exception) { return false;} finally { System.IO.File.Delete(strTempUrl);}//删除临时文件 } </span>
之后,在处理文件之前加入如下判断就ok了:
<span style="font-size:14px;"> if (int.TryParse(HttpContext.Current.Request.QueryString["MaterialVoice"], out MaterialVoice))//如果是素材里面上传音频的话 { if (!ChkVideoTotalTime(files[0])) { return strRequest = "errorTime"; //如果超过60s } }</span>
PS:别忘了前台验证。