public void HandleUploadFiles(HttpFileCollectionBase files, Int64 id) { foreach (string file in Request.Files) { var fileDataContent = Request.Files[file]; var stream = fileDataContent.InputStream; var fileName = Path.GetFileName(fileDataContent.FileName); var uploadPath = Server.MapPath("~/App_Data/uploads"); if (!FileHelper.ExistDirectory(uploadPath)) { FileHelper.CreateDirectory(uploadPath); } var path = Path.Combine(uploadPath, fileName); //使用瞬态故障处理库Polly处理异常,采用等待重试策略 PollyHelper.WaitAndRetry <IOException>(() => { if (FileHelper.Exist(path)) { FileHelper.Delete(path); } using (var fileStream = System.IO.File.Create(path)) { stream.CopyTo(fileStream); } // 当上传中断,已上传部分是否能合并?(待优化) var ut = new Utils(); var storeFileName = string.Empty; var result = false; //Merge file ut.MergeFile(path, out result, out storeFileName); if (result) { var model = bookRepository.GetById(id); model.Url = storeFileName; bookRepository.Update(model); unitOfWork.Commit(); } }); } }
public bool MergeFile(string fileName, out bool result, out string storeFileName) { result = false; storeFileName = string.Empty; var fileNamePartToken = fileName.IndexOf(PARTTOKEN); var baseFileName = fileName.Substring(0, fileNamePartToken); var trailingTokens = fileName.Substring(fileNamePartToken + PARTTOKEN.Length); var fileIndex = 0; var fileCount = 0; int.TryParse(trailingTokens.Substring(0, trailingTokens.IndexOf(".")), out fileIndex); int.TryParse(trailingTokens.Substring(0, trailingTokens.IndexOf(".")), out fileCount); var searchPattern = Path.GetFileName(baseFileName) + PARTTOKEN + "*"; var filesList = FileHelper.GetFiles(Path.GetDirectoryName(fileName), searchPattern); if (filesList.Count() == fileCount) { var extensionName = FileHelper.GetExtensionName(baseFileName); storeFileName = FileHelper.GetFileNameWithoutExtension(baseFileName) + extensionName; } if (!MergeFileSingleton.Instance.InUse(baseFileName)) { MergeFileSingleton.Instance.AddFile(baseFileName); if (FileHelper.Exist(baseFileName)) { FileHelper.Delete(baseFileName); } var mergeList = new List <SortedFile>(); foreach (var file in filesList) { var sortedFile = new SortedFile { FileName = file }; baseFileName = file.Substring(0, file.IndexOf(PARTTOKEN)); trailingTokens = file.Substring(file.IndexOf(PARTTOKEN) + PARTTOKEN.Length); int.TryParse(trailingTokens.Substring(0, trailingTokens.IndexOf(".")), out fileIndex); sortedFile.FileOrder = fileIndex; mergeList.Add(sortedFile); } var mergeOrder = mergeList.OrderBy(s => s.FileOrder).ToList(); using (var fileStream = new FileStream(baseFileName, FileMode.Create)) { try { foreach (var chunk in mergeOrder) { PollyHelper.WaitAndRetry <IOException>(() => { using (var fileChunk = new FileStream(chunk.FileName, FileMode.Open)) { fileChunk.CopyTo(fileStream); } }); } } catch (IOException e) { return(false); throw e; } } result = true; MergeFileSingleton.Instance.RemoveFile(baseFileName); Parallel.ForEach(mergeList, (d) => { FileHelper.Delete(d.FileName); }); } return(result); }