using IRaCIS.Application.Interfaces; using System.Text; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Application.Helper; using Microsoft.AspNetCore.Hosting; namespace IRaCIS.Application.Services { public class FileService : IFileService { private readonly IDoctorService _doctorService; private readonly IAttachmentService _attachmentService; private readonly IWebHostEnvironment _hostEnvironment; private string defaultUploadFilePath = string.Empty; private readonly ILogger _logger; public FileService(IDoctorService doctorService, IAttachmentService attachmentService, IWebHostEnvironment hostEnvironment, ILogger logger) { _doctorService = doctorService; _attachmentService = attachmentService; _hostEnvironment = hostEnvironment; defaultUploadFilePath = FileStoreHelper.GetIRaCISRootPath(_hostEnvironment); _logger = logger; } /// /// 打包医生官方简历 /// /// /// /// public async Task CreateOfficialResumeZip(int language, Guid[] doctorIds) { //准备下载文件的临时路径 var guidStr = Guid.NewGuid().ToString(); string uploadFolderPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "UploadFile"); var tempSavePath = Path.Combine(uploadFolderPath, "temp", guidStr); //待压缩的文件夹,将需要下载的文件拷贝到此文件夹 if (!Directory.Exists(tempSavePath)) { Directory.CreateDirectory(tempSavePath); } //找到服务器简历路径 循环拷贝简历到临时路径 foreach (var doctorId in doctorIds) { var doctor = await _doctorService.GetBasicInfo(doctorId); var doctorName = doctor.FirstName + "_" + doctor.LastName; //找官方简历存在服务器的相对路径 var sourceCvPath = await _attachmentService.GetDoctorOfficialCV(language, doctorId); if (!string.IsNullOrWhiteSpace(sourceCvPath)) { //服务器简历文件实际路径 //var sourceCvFullPath = HostingEnvironment.MapPath(sourceCvPath); var sourceCvPathTemp = sourceCvPath.Substring(1, sourceCvPath.Length - 1);//.Replace('/','\\'); string sourceCvFullPath = Path.Combine(defaultUploadFilePath, sourceCvPathTemp); var arr = sourceCvPath.Split('.'); string extensionName = arr[arr.Length - 1]; //得到扩展名 //需要拷贝到的路径 var doctorPath = Path.Combine(tempSavePath, doctor.ReviewerCode.ToString() + "_" + doctorName + "." + extensionName); if (File.Exists(sourceCvFullPath)) { File.Copy(sourceCvFullPath, doctorPath, true); } } } //创建ZIP DateTime now = DateTime.Now; StringBuilder sb = new StringBuilder(); sb.Append(now.Year).Append(now.Month.ToString().PadLeft(2, '0')).Append(now.Day.ToString().PadLeft(2, '0')) .Append(now.Hour.ToString().PadLeft(2, '0')).Append(now.Minute.ToString().PadLeft(2, '0')) .Append(now.Second.ToString().PadLeft(2, '0')).Append(now.Millisecond.ToString().PadLeft(3, '0')); string targetZipPath = Path.Combine(uploadFolderPath, "CV_" + sb.ToString() + ".zip"); ZipHelper.CreateZip(tempSavePath, targetZipPath); //返回Zip路径 return Path.Combine("/IRaCISData/UploadFile/", "CV_" + sb.ToString() + ".zip"); } /// /// 打包医生的所有附件 /// /// /// public async Task CreateDoctorsAllAttachmentZip(Guid[] doctorIds) { //准备下载文件的临时路径 var guidStr = Guid.NewGuid().ToString(); //string uploadFolderPath = HostingEnvironment.MapPath("/UploadFile/"); string uploadFolderPath = Path.Combine(FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment), "UploadFile"); var tempSavePath = Path.Combine(uploadFolderPath, "temp", guidStr); //待压缩的文件夹,将需要下载的文件拷贝到此文件夹 if (!Directory.Exists(tempSavePath)) { Directory.CreateDirectory(tempSavePath); } foreach (var doctorId in doctorIds) { //获取医生基本信息 var doctor = await _doctorService.GetBasicInfo(doctorId); var doctorName = doctor.FirstName + "_" + doctor.LastName; var doctorCode = doctor.ReviewerCode; var doctorDestPath = Path.Combine(tempSavePath, doctorCode + "_" + doctorName); if (!Directory.Exists(doctorDestPath)) { Directory.CreateDirectory(doctorDestPath); } //服务器上传后的源路径 string doctorFileSourcePath = Path.Combine(uploadFolderPath, doctorId.ToString()); if (Directory.Exists(doctorFileSourcePath)) { CopyDirectory(doctorFileSourcePath, doctorDestPath); } } string target = Guid.NewGuid().ToString(); string targetPath = Path.Combine(uploadFolderPath, target + ".zip"); ZipHelper.CreateZip(tempSavePath, targetPath); return Path.Combine("/IRaCISData/UploadFile/", target + ".zip"); } public async Task CreateZipPackageByAttachment(Guid doctorId, Guid[] attachmentIds) { var doctor = await _doctorService.GetBasicInfo(doctorId); var doctorName = doctor.FirstName + "_" + doctor.LastName; Guid temp = Guid.NewGuid(); //string root = HostingEnvironment.MapPath("/UploadFile/"); //文件根目录 string root = Path.Combine(defaultUploadFilePath, "UploadFile"); var tempPath = Path.Combine(root, "temp", temp.ToString(), doctor.ReviewerCode + doctorName); //待压缩的文件夹,将需要下载的文件拷贝到此文件夹 var packagePath = Path.Combine(root, "temp", temp.ToString()); //打包目录 if (!Directory.Exists(tempPath)) { Directory.CreateDirectory(tempPath); } var attachemnts = (await _attachmentService.GetAttachments(doctorId)).Where(a => attachmentIds.Contains(a.Id)); foreach (var item in attachemnts) { var arr = item.Path.Trim().Split('/'); var myPath = string.Empty; var myFile = string.Empty; //需要改进 if (arr.Length > 0) { myFile = arr[arr.Length - 1]; foreach (var arrItem in arr) { if (arrItem != string.Empty && !"UploadFile".Equals(arrItem)) { myPath += (arrItem + "/"); } } myPath = myPath.TrimEnd('/'); } var sourcePath = Path.Combine(root, myPath); if (!string.IsNullOrWhiteSpace(sourcePath) && File.Exists(sourcePath)) { File.Copy(sourcePath, Path.Combine(tempPath, myFile), true); } } string target = Guid.NewGuid().ToString(); string targetPath = Path.Combine(root, target + ".zip"); ZipHelper.CreateZip(packagePath, targetPath); return Path.Combine("/IRaCISData/UploadFile/", target + ".zip"); } private static void CopyDirectory(string srcPath, string destPath) { DirectoryInfo dir = new DirectoryInfo(srcPath); FileSystemInfo[] fileInfoArray = dir.GetFileSystemInfos(); //获取目录下(不包含子目录)的文件和子目录 foreach (FileSystemInfo fileInfo in fileInfoArray) { if (fileInfo is DirectoryInfo) //判断是否文件夹 { if (!Directory.Exists(destPath + "\\" + fileInfo.Name)) { Directory.CreateDirectory(destPath + "\\" + fileInfo.Name); //目标目录下不存在此文件夹即创建子文件夹 } CopyDirectory(fileInfo.FullName, destPath + "\\" + fileInfo.Name); //递归调用复制子文件夹 } else { File.Copy(fileInfo.FullName, destPath + "\\" + fileInfo.Name, true); //不是文件夹即复制文件,true表示可以覆盖同名文件 } } } } }