.net 文件切片合并
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() }); }