/// <summary> /// 是否所有的文件块都已经上传到服务器 /// </summary> /// <returns></returns> public bool IsAllBlocksUploaded(PartialFileModel partialFileModel) { if (dbContext.PartialFileModels.Count(s => s.FileId == partialFileModel.FileId) == partialFileModel.PartialCount) { return(true); } return(false); }
public IHttpActionResult DownloadBigFile(PartialFileModel partialFileModel) { HttpResponseMessage httpResponseMessage = null; try { SystemFiles systemFiles = null; if (partialFileModel.Id != 0) { // 传入的id是int类型,说明是Id字段 systemFiles = dbContext.SystemFiles.FirstOrDefault(s => s.Id == partialFileModel.Id); } else if (partialFileModel.FileId.HasValue && partialFileModel.FileId != Guid.Empty) { // 传入的id不是int类型,说明是FileId字段 systemFiles = dbContext.SystemFiles.FirstOrDefault(s => s.FileId == partialFileModel.FileId); } else { throw new Exception("传入文件Id无效"); } var filePath = this.GetFilePath(systemFiles); LogHelper.Info($"FileName:{systemFiles.FileName}"); var browser = String.Empty; if (HttpContext.Current.Request.UserAgent != null) { browser = HttpContext.Current.Request.UserAgent.ToUpper(); } httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK); FileStream fileStream = File.OpenRead(filePath); httpResponseMessage.Content = new StreamContent(fileStream); httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = browser.Contains("FIREFOX") ? systemFiles.FileName : HttpUtility.UrlEncode(Path.GetFileName(systemFiles.FileName)) }; return(ResponseMessage(httpResponseMessage)); } catch (Exception ex) { httpResponseMessage = new HttpResponseMessage(HttpStatusCode.InternalServerError); httpResponseMessage.Content = new StringContent(ex.Message); return(ResponseMessage(httpResponseMessage)); } }
public IHttpActionResult UploadBigFile([FromUri] PartialFileModel partialFileModel) { try { lock (syncObject) { var file = new FileInfo($"{AppConfig.BigFileTempStorage}\\{partialFileModel.FileId}_{partialFileModel.PartialId}"); if (file.Exists) { file.Delete(); } using (File.Create(file.FullName)) { } using (var sourceStream = Request.Content.ReadAsStreamAsync().Result) using (var stream = file.OpenWrite()) { sourceStream.CopyTo(stream); } dbContext.PartialFileModels.Add(partialFileModel); dbContext.SaveChanges(); if (!IsAllBlocksUploaded(partialFileModel)) { partialFileModel.IsMerged = false; } else { this.Merge(partialFileModel); partialFileModel.IsMerged = true; } } partialFileModel.IsSuccess = true; partialFileModel.FileData = null; return(Json(partialFileModel)); } catch (Exception ex) { partialFileModel.IsSuccess = false; partialFileModel.FileData = null; partialFileModel.Message = ex.ToString(); return(Json(partialFileModel)); } }
/// <summary> /// 合并文件 /// </summary> private void Merge(PartialFileModel partialFileModel) { var mergeFileBytes = new List <byte>(); var partialFileList = new List <FileInfo>(); // 取得分片文件内容,拼接成初始文件 for (int i = 0; i < partialFileModel.PartialCount; i++) { var file = new FileInfo($"{AppConfig.BigFileTempStorage}\\{partialFileModel.FileId}_{i}"); using (var tf = file.OpenRead()) { var blockBytes = new byte[tf.Length]; tf.Read(blockBytes, 0, blockBytes.Length); mergeFileBytes.AddRange(blockBytes); } partialFileList.Add(file); } // 保存初始上传大文件 SystemFiles systemFiles = new SystemFiles(); var FolderName = ConfigurationManager.AppSettings[partialFileModel.ProjectName]; if (FolderName == null) { FolderName = partialFileModel.ProjectName; } string day = DateTime.Now.ToString("yyyyMMdd"); string folder = FolderName + "/" + day; string filePath = $"{AppConfig.FileUploadRootDirectory}/{folder}"; if (Directory.Exists(filePath) == false)// 如果不存在就创建file文件夹 { Directory.CreateDirectory(filePath); } string longName = Guid.NewGuid().ToString(); string SaveFileName = longName + partialFileModel.FileExtension; // 保存文件名称 using (FileStream fs = File.Create(filePath + "/" + SaveFileName)) { fs.Write(mergeFileBytes.ToArray(), 0, mergeFileBytes.Count); } systemFiles = new SystemFiles() { FileId = partialFileModel.FileId, FileData = null, FilePath = folder + "/" + SaveFileName, FileExtension = partialFileModel.FileExtension, FileName = partialFileModel.FileName, FileLongName = SaveFileName, FileSize = mergeFileBytes.Count, ProjectName = partialFileModel.ProjectName, CreateDate = DateTime.Now, FileCompressStatus = EnumFileCompressStatus.Uncompressed, TobeArchiveDateTime = DateTime.Now.AddDays((int)EnumArchivePeriod.Quarter) }; dbContext.SystemFiles.Add(systemFiles); dbContext.SaveChanges(); partialFileModel.Id = systemFiles.Id; // 删除上传的分片小文件 foreach (var file in partialFileList) { if (file.Exists) { file.Delete(); } } }