using Common; using Common.system; using Newtonsoft.Json.Linq; using System; using System.Collections.Specialized; using System.Threading; using XHWK.Model; namespace XHWK.WKTool.DAL { /// /// 上传相关方法 创建人:赵耀 创建时间:2020年9月4日 /// public class DalUpload { private readonly string _fileRequestAddress = App.uploadUrl; //private string schoolfileRequestAddress = APP.showImageUrl; /// /// 文件是否允许上传 /// /// /// 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, ""); if (jo == null) { message = "无法访问文件服务器,请检查网络或文件服务器地址。"; return false; } //修改为0为之前上传成功,1为之前未上传成功 if (jo["code"]?.ToString() == "0") { message = ""; Model.ResultVo resultObj = JsonHelper.JsonToObj>(jo.ToString()); App.ResourceAddTwo = resultObj.obj; //已存在 不允许上传 return false; } else { message = ""; //不存在 允许上传 return true; } } 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, ""); if (jo == null) { message = "无法访问文件服务器,请检查网络或文件服务器地址。"; return false; } Model.ResultVo resultObj = JsonHelper.JsonToObj>(jo.ToString()); App.ResourceAddTwo = new Model_ResourceAddTwo(); //0成功,1失败 if (resultObj.code == 0 && resultObj.obj != null) { App.ResourceAddTwo = resultObj.obj; return true; } else { //Message = "上传失败!"; 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; } if (videoInfo.IsUpload) { errMessage = "视频已上传"; return false; } else { return true; } } catch (Exception ex) { LogHelper.WriteErrLog("【视频上传】(UploadVideo)视频上传失败:" + ex.Message, ex); } return false; } /// /// 上传视频 /// /// /// public bool UploadVideoTwo(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"; //zxyceshi if (videoInfo.IsUpload) { errMessage = "视频已上传"; return false; } else { if (string.IsNullOrWhiteSpace(videoInfo.FileMD5)) { videoInfo.FileMD5 = AESHelper.AESEncrypt(FileToolsCommon.ReadBigFileStr(videoInfo.VideoPath, 1024)); } //视频长度 long filelen = FileToolsCommon.GetFileSize(videoInfo.VideoPath); //每片的长度 double uploadSliceLenMb = double.Parse(FileToolsCommon.GetConfigValue("UploadSliceLen")); string fileName = FileToolsCommon.GetFileName(videoInfo.VideoPath); //是否续传 //分块数为0时 从未上传过 if (videoInfo.Block > 0) { //是否已上传所有分块 if (videoInfo.Block > videoInfo.Uploaded) { //已上传,未上传完 } else { //上传完,未合并 #region 合并文件 //合并文件 bool isres = ReportFileMerge ( App.UserInfo.cloudcode + "/" + App.UserInfo.Schoolid.ToString() + "/resource", videoInfo.FileGuid, out errMessage ); if (isres) { videoInfo.IsUpload = true; return true; } else { return false; } #endregion 合并文件 } } else { //是否允许上传 if (IsAllowUploaded(videoInfo.FileMD5, out errMessage)) { if (videoInfo.SliceLen == 0) { videoInfo.SliceLen = (long)(uploadSliceLenMb * 1024 * 1024); videoInfo.Block = (int)(filelen / videoInfo.SliceLen + (filelen % videoInfo.SliceLen > 0 ? 1 : 0)); } } else { //文件在服务器上已存在 空间是否存在未知 若增加空间是否存在判断在此处添加 videoInfo.Block = 1; videoInfo.Uploaded = 1; videoInfo.IsUpload = true; return true; } } ////临时修改 没有断点续传,每次上传都重新上传。 //VideoInfo.Uploaded = 0; { //已上传长度 long len; //分块 do { len = videoInfo.Uploaded * videoInfo.SliceLen; //取指定长度的流 byte[] byteArray = FileToolsCommon.ReadBigFileSpecifyLength(videoInfo.VideoPath, len, (int)videoInfo.SliceLen); //参数 NameValueCollection formFields = new NameValueCollection { { "identifier", videoInfo.FileGuid }, { "chunkNumber", (videoInfo.Uploaded + 1).ToString() }, { "filename", fileName }, { "totalchunk", videoInfo.Block.ToString() }, { "md5", videoInfo.FileMD5 } }; //formFields.Add();///教材 //if()//章节若没选不传 //{ // formFields.Add(); //} JObject jo = HttpHelper.UploadRequestflow(uploadUrl, byteArray, fileName, formFields); //0成功,1失败 if (jo["code"]?.ToString() != "0") { errMessage = jo["msg"]?.ToString(); return false; } else { videoInfo.Uploaded++; } } while (len + videoInfo.SliceLen < filelen); #region 合并文件 //合并文件 bool isres = ReportFileMerge ( App.UserInfo.cloudcode + "/" + App.UserInfo.Schoolid.ToString() + "/resource", videoInfo.FileGuid, out errMessage ); if (isres) { //VideoInfo.IsUpload = true; return true; } else { return false; } #endregion 合并文件 } } } catch (Exception ex) { LogHelper.WriteErrLog("【视频上传】(UploadVideo)视频上传失败:" + ex.Message, ex); } return false; } } }