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 /*"http://192.168.2.18:8908"*/ + @"/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 /*"http://192.168.2.18:8908"*/ + @"/chunkdb/mergechunk", @"application/x-www-form-urlencoded", @"savefolder=" + Savefolder + "&identifier=" + FileCode, "");
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;
}
string UploadUrl = FileRequestAddress /*"http://192.168.2.18:8908" */+ "/chunkdb/upchunk";//zxyceshi
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, (int)VideoInfo.SliceLen);
// //参数
// 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;
// }
//}
//分块
do
{
len = VideoInfo.Uploaded * VideoInfo.SliceLen;
//取指定长度的流
byte[] byteArray = FileToolsCommon.ReadBigFileSpecifyLength(VideoInfo.VideoPath, len, (int)VideoInfo.SliceLen);
//参数
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);
VideoInfo.Uploaded++;
//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;
}
} while (len + VideoInfo.SliceLen < filelen);
//合并文件
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;
}
}
}