using Common; using Common.system; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using XHWK.Model; namespace XHWK.WKTool.DAL { /// /// 上传相关方法 /// 创建人:赵耀 /// 创建时间:2020年9月4日 /// public class DAL_Upload { string APIRequestAddress = FileToolsCommon.GetConfigValue("APIRequestAddress"); string FileRequestAddress = FileToolsCommon.GetConfigValue("FileRequestAddress"); string schoolfileRequestAddress = FileToolsCommon.GetConfigValue("schoolfileRequestAddress"); /// /// 文件是否允许上传 /// /// MD5 /// 错误消息 /// public bool IsAllowUploaded(string MD5, out string Message) { Exception ex = null; Message = "";//请求重试5次 共5秒 for (int num = 0; num < 5; num++) { try { JObject jo = HttpHelper.PostFunction(FileRequestAddress + @"/chunkdb/isexist", @"application/x-www-form-urlencoded", @"md5=" + MD5, ""); //0成功,1失败 if (jo["code"].ToString() == "0") { if (string.IsNullOrWhiteSpace(jo["obj"].ToString())) { //不存在 允许上传 return true; } else { //已存在 不允许上传 return false; } } else { Message = jo["msg"].ToString(); return false; } } catch (Exception e) { Message = e.Message; ex = e; Thread.Sleep(1000); } } string ErrMessage = "【文件是否存在】(IsUploaded):请求失败。" + Message; LogHelper.WriteErrLog(ErrMessage, ex); return false; } /// /// 上报文件合并指令 /// /// 保存文件位置 学校id/resource /// 文件唯一编号 Guid /// 错误信息 /// public bool ReportFileMerge(string Savefolder, string FileCode, out string Message) { Exception ex = null; Message = "";//请求重试5次 共5秒 for (int num = 0; num < 5; num++) { try { JObject jo = HttpHelper.PostFunction(FileRequestAddress + @"/chunkdb/mergechunk", @"application/x-www-form-urlencoded", @"savefolder=" + Savefolder + "&identifier=" + FileCode, ""); //0成功,1失败 if (jo["code"].ToString() == "0") { return true; } else { Message = jo["msg"].ToString(); return false; } } catch (Exception e) { Message = e.Message; ex = e; Thread.Sleep(1000); } } string ErrMessage = "【上报合并文件】(ReportFileMerge):请求失败。" + Message; LogHelper.WriteErrLog(ErrMessage, ex); return false; } /// /// 上传视频 /// /// public bool UploadVideo(string VideoGuid, out string ErrMessage) { ErrMessage = ""; try { Model_Video VideoInfo = null; foreach (Model_WKData Vdata in APP.WKDataList) { if (Vdata.VideoList == null) continue; foreach (Model_Video videoinfo in Vdata.VideoList) { if(videoinfo.FileGuid== VideoGuid) { VideoInfo = videoinfo; break; } } if (VideoInfo != null) break; } if (VideoInfo==null) { ErrMessage = "未找到课程!"; return false; } string UploadUrl = FileRequestAddress + "/chunkdb/upchunk"; if (VideoInfo.IsUpload) { ErrMessage = "视频已上传"; return false; } else { if (string.IsNullOrWhiteSpace(VideoInfo.FileMD5)) { VideoInfo.FileMD5 = AESHelper.AESEncrypt(FileToolsCommon.ReadBigFileStr(VideoInfo.VideoPath, 1024)); } if (IsAllowUploaded(VideoInfo.FileMD5, out ErrMessage)) { //视频长度 long filelen = FileToolsCommon.GetFileSize(VideoInfo.VideoPath); //每片的长度 double UploadSliceLenMB = double.Parse(FileToolsCommon.GetConfigValue("UploadSliceLen")); if (VideoInfo.SliceLen == 0) { VideoInfo.SliceLen = (long)(UploadSliceLenMB * 1024 * 1024); VideoInfo.Block = (int)(filelen / VideoInfo.SliceLen + (filelen % VideoInfo.SliceLen > 0 ? 1 : 0)); } //已上传长度 long len = VideoInfo.Uploaded * VideoInfo.SliceLen; string fileName = FileToolsCommon.GetFileName(VideoInfo.VideoPath); //分块 for (; len + VideoInfo.SliceLen < filelen; VideoInfo.Uploaded++) { len = VideoInfo.Uploaded * VideoInfo.SliceLen; //取指定长度的流 byte[] byteArray = FileToolsCommon.ReadBigFileSpecifyLength(VideoInfo.VideoPath, len, 102400); //参数 NameValueCollection formFields = new NameValueCollection(); formFields.Add("identifier", VideoInfo.FileGuid); formFields.Add("chunkNumber", (VideoInfo.Uploaded + 1).ToString()); formFields.Add("filename", fileName); formFields.Add("totalchunk", VideoInfo.Block.ToString()); formFields.Add("md5", VideoInfo.FileMD5); JObject jo = HttpHelper.UploadRequestflow(UploadUrl, byteArray, fileName, formFields); //0成功,1失败 if (jo["code"].ToString() != "0") { ErrMessage = jo["msg"].ToString(); return false; } } //合并文件 bool isres = ReportFileMerge(APP.UserInfo.Schoolid.ToString() + "/resource", VideoInfo.FileGuid, out ErrMessage); if (isres) { VideoInfo.IsUpload = true; return true; } else { return false; } } else { ErrMessage = "上传失败:" + ErrMessage; return false; } } } catch (Exception ex) { LogHelper.WriteErrLog("【视频上传】(UploadVideo)视频上传失败:" + ex.Message, ex); } return false; } } }