예제 #1
0
        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();
                    }
                });
            }
        }
예제 #2
0
파일: Utils.cs 프로젝트: striveCj/StudyCode
        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);
        }