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 DAL_Upload
{
//private string APIRequestAddress = APP.apiUrl;
private 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;
// if (string.IsNullOrWhiteSpace(jo["obj"].ToString()))
// {
// //不存在 允许上传
// return true;
// }
// else
// {
// //已存在 不允许上传
// 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;
//foreach (Model_WKData Vdata in APP.WKDataList)
//{
// if (Vdata.VideoList == null)
// {
// continue;
// }
// foreach (Model_Video videoinfo in Vdata.VideoList)
// {
// if (videoinfo.FileGuid == FileCode)
// {
// //videoinfo.IsUpload = true;
// break;
// }
// }
//}
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 + "/chunkdb/upchunk";//zxyceshi
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);
//是否续传
bool IsSequel = true;
//分块数为0时 从未上传过
if(VideoInfo.Block>0)
{
//是否已上传所有分块
if(VideoInfo.Block> VideoInfo.Uploaded)
{
//已上传,未上传完
IsSequel = true;
}
else
{
//上传完,未合并
IsSequel = false;
#region 合并文件
//合并文件
bool isres = ReportFileMerge(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))
{
IsSequel = true;
if (VideoInfo.SliceLen == 0)
{
VideoInfo.SliceLen = (long)(UploadSliceLenMB * 1024 * 1024);
VideoInfo.Block = (int)(filelen / VideoInfo.SliceLen + (filelen % VideoInfo.SliceLen > 0 ? 1 : 0));
}
}
else
{
//文件在服务器上已存在 空间是否存在未知 若增加空间是否存在判断在此处添加
IsSequel = false;
VideoInfo.Block = 1;
VideoInfo.Uploaded = 1;
VideoInfo.IsUpload = true;
return true;
}
}
////临时修改 没有断点续传,每次上传都重新上传。
//VideoInfo.Uploaded = 0;
if (IsSequel)
{
//已上传长度
long len = VideoInfo.Uploaded * VideoInfo.SliceLen;
#region 废弃
////分块
//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;
// }
//}
#endregion
//分块
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 }
};
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);
#region 合并文件
//合并文件
bool isres = ReportFileMerge(APP.UserInfo.Schoolid.ToString() + "/resource", VideoInfo.FileGuid, out ErrMessage);
if (isres)
{
//VideoInfo.IsUpload = true;
return true;
}
else
{
return false;
}
#endregion
}
else
{
if (string.IsNullOrWhiteSpace(ErrMessage))
{
//VideoInfo.IsUpload = true;
return true;
}
else
{
return false;
}
}
}
}
catch (Exception ex)
{
LogHelper.WriteErrLog("【视频上传】(UploadVideo)视频上传失败:" + ex.Message, ex);
}
return false;
}
}
}