try
{
if (Request.HasFormContentType)
{
var form = Request.Form;
var file = Request.Form.Files[0];
var fullhost = form["fullhost"];
var uid = form["uid"];
var lastModified = form["lastModified"];
var lastModifiedDate = form["lastModifiedDate"];
var name = form["name"];
var size = long.TryParse(form["size"], out long _size) ? _size : 0;
var type = form["type"];
var chunk = int.TryParse(form["chunk"], out int _chunk) ? _chunk : 0;
var chunks = int.TryParse(form["chunks"], out int _chunks) ? _chunks : 0;
var mediaType = int.TryParse(form["mediaType"], out int _mediaType) ? _mediaType : 0;
MediaModel model = new MediaModel();
if (_SSOClient.IsLogin)
{
model.CreateBy = _SSOClient.User.UserNo;
model.BU = _SSOClient.User.BU ?? "";
}
model.CreateOn = DateTime.Now;
model.ModifiedBy = model.CreateBy;
model.ModifiedOn = DateTime.Now;
model.RecordStatus = RecordStatus.Default;
model.MediaFileName = name;
model.MediaFileSize = size;
model.MediaFilePath = "";
model.MediaCover = "";
model.MediaUrl = "";
model.MediaFileFormat = Path.GetExtension(name).Substring(1);
model.MediaFileType = (MediaFileType)mediaType;
model.MediaDuration = 0;
model.MediaStatus = MediaStatus.Default;
model.MediaStatusMsg = "";
model.MediaThirdType = MediaThirdType.Baidu;
bool isupload = false;//文件上传
bool ischunk = false;//切片文件上传
FileInfo fileInfo = new FileInfo(GetFilePath(name));
if (!fileInfo.Directory.Exists)
{
fileInfo.Directory.Create();
}
string otherMsg = "";
if (chunks == 1)
{
#region 单文件
using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Create, FileAccess.Write))
{
file.CopyTo(fs);
fs.Flush();
isupload = true;
}
model.ModifiedOn = DateTime.Now;
#endregion
}
else
{
#region 切片文件
otherMsg += " start ";
var dirPath = Path.Combine(GetFileTempPath(), uid);
FileInfo tempfileInfo = new FileInfo(Path.Combine(dirPath, chunk + Path.GetExtension(name)));
if (!tempfileInfo.Directory.Exists)
{
tempfileInfo.Directory.Create();
}
FileInfo[] files = null;
using (FileStream fs = new FileStream(tempfileInfo.FullName, FileMode.Create, FileAccess.Write))
{
otherMsg += " save " + tempfileInfo.Name;
//存储块文件
file.CopyTo(fs);
fs.Flush();
ischunk = true;
otherMsg += " save chunk ok ";
}
files = tempfileInfo.Directory.GetFiles();
if (CacheFile)
{
using (var stream = new MemoryStream())
{
file.CopyTo(stream);
stream.Position = 0;
var bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
if (!CacheFileList.ContainsKey(uid))
{
CacheFileList.Add(uid, new Dictionary<FileInfo, byte[]> { { tempfileInfo, bytes } });
}
else
{
var _che = CacheFileList[uid];
_che.Add(tempfileInfo, bytes);
}
}
files = CacheFileList[uid].Keys.ToArray();
}
var _totalSize = files.Sum(f => f.Length);
otherMsg += $" filelen:{file.Length} Length:{files.Length}, chunks: {chunks},totalSize:{_totalSize} ,size:{size}";
if (files.Length == chunks)// && _totalSize == size
{
otherMsg += " merge ";
model.CreateOn = files.OrderBy(f => f.LastWriteTime).Select(t => t.LastWriteTime).First();
model.ModifiedOn = files.OrderBy(f => f.LastWriteTime).Select(t => t.LastWriteTime).Last();
//合并文件
using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Create))
{
foreach (var part in files.Select(t => new { sort = int.Parse(t.Name.Replace(t.Extension, "")), FullName = t.FullName, Name = t.Name, Length = t.Length, file = t }).OrderBy(t => t.sort))
{
otherMsg += " > " + part.Name + " " + part.Length;
byte[] _bytes = null;
if (CacheFile)
{
_bytes = CacheFileList[uid][part.file];
}
else
{
_bytes = System.IO.File.ReadAllBytes(part.FullName);
}
fs.Write(_bytes, 0, _bytes.Length);
}
}
try
{
tempfileInfo.Directory.Delete(true);
otherMsg += " temp delete true ";
}
catch (Exception _e)
{
otherMsg += " temp delete " + _e.Message;
}
if (CacheFile && CacheFileList.ContainsKey(uid))
{
CacheFileList.Remove(uid);
}
isupload = true;
otherMsg += " isupload true ";
}
#endregion
}
var percentage = Convert.ToInt32(Math.Ceiling(((decimal)chunk / chunks) * 100));
if (ischunk)
{
if (!isupload)
{
return Json(new { code = 201, msg = $"{chunk}/{chunks}", chunk, chunks, percentage, otherMsg });
}
}
if (isupload)
{
model.MediaFilePath = fileInfo.FullName.Replace(_env.ContentRootPath, "").Replace("\\", "/");
model.MediaUrl = fullhost + HttpUtility.UrlEncode(model.MediaFilePath) + "&contentType=" + HttpUtility.UrlEncode(type);
var rs = _service.Add(model);
return Json(new { code = 200, msg = "上传成功", chunk, chunks, percentage, model = rs.Item2, otherMsg }, JsonSettings);
}
}
}
catch (Exception ex)
{
return Json(new { code = 500, msg = ex.Message, error = ex.ToString() });
}