예제 #1
0
        /// <summary>
        /// 是否所有的文件块都已经上传到服务器
        /// </summary>
        /// <returns></returns>
        public bool IsAllBlocksUploaded(PartialFileModel partialFileModel)
        {
            if (dbContext.PartialFileModels.Count(s => s.FileId == partialFileModel.FileId) == partialFileModel.PartialCount)
            {
                return(true);
            }

            return(false);
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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));
            }
        }
예제 #4
0
        /// <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();
                }
            }
        }