.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() });
            }

  

posted @ 2023-05-17 00:23  unstable  阅读(44)  评论(0编辑  收藏  举报