.NET 6 API中实现文件的下载。
创建HttpHeaderConstant用于指定http头。
public sealed class HttpHeaderConstant{public const string RESPONSE_HEADER_CONTENTTYPE_STREAM = "application/octet-stream";public const string RESPONSE_HEADER_NAME_FILENAME = "fileName";public const string RESPONSE_HEADER_CONTEN_DISPOSITION_ATTACHMENT = "attachment";public const string RESPONSE_HEADER_APPLICATION_JSON = "application/json";}
多文件下载,利用zip进行压缩包处理,可以指定压缩等级。
public async Task<IActionResult> MultiDownloadDocuments(DownloadDocumentParameter downloadDocumentParameter, string? shareFolderPath = null){string downloadFileAbsolute = string.Empty;var documentDtos = downloadDocumentParameter.Details;string exportFileName = "Document_" + DateTime.Now.ToString("yyyyMMddHHmmss");try{string fileExtend = ".zip";var appPath = AppDomain.CurrentDomain.BaseDirectory;var downloadFileName = Path.Combine(appPath, "TmpFolder");if (!Directory.Exists(downloadFileName))Directory.CreateDirectory(downloadFileName);if (documentDtos != null && documentDtos.Any()){if (documentDtos.Count > 1){//zipfileExtend = ".zip";exportFileName = exportFileName + fileExtend;downloadFileName = Path.Combine(downloadFileName, exportFileName);using (ZipOutputStream s = new ZipOutputStream(File.Create(downloadFileName))){s.SetLevel(9); // 0-9, 9 being the highest compressionbyte[] buffer = new byte[4096];for (int i = 0; i < documentDtos.Count; i++){string absoluteFile = GetFileFromShareFolder(documentDtos[i].DocumentPath, shareFolderPath);string originalFileName = documentDtos[i].DocumentName;if (File.Exists(absoluteFile)){FileInfo fileInfo = new FileInfo(absoluteFile);var zipName = exportFileName;if (string.IsNullOrEmpty(originalFileName)){originalFileName = fileInfo.Name;}ZipEntry entry = new ZipEntry(originalFileName);entry.DateTime = DateTime.Now;entry.IsUnicodeText = true;s.PutNextEntry(entry);using (FileStream fs = File.OpenRead(absoluteFile)){int sourceBytes;do{sourceBytes = fs.Read(buffer, 0, buffer.Length);s.Write(buffer, 0, sourceBytes);} while (sourceBytes > 0);}}else{Log.Error($"MultiDownloadDocuments Error==={originalFileName} {CorProMessage.FileNotExist}");}}s.Finish();s.Close();}downloadFileAbsolute = downloadFileName;}else{string absoluteFile = GetFileFromShareFolder(documentDtos[0].DocumentPath, shareFolderPath);// AgencyCorProConstant.DocumentPrefixPath + "\\" + documentDtos[0].DocumentPath;string originalFileName = documentDtos[0].DocumentName;if (File.Exists(absoluteFile)){if (string.IsNullOrEmpty(originalFileName)){originalFileName = new FileInfo(absoluteFile).Name;}exportFileName = StringEx.ReplaceSpecialChart(originalFileName);downloadFileAbsolute = absoluteFile;}}}}catch (Exception ex){Log.Error(ex, $"MultiDownloadDocuments failed. {ex.Message}");}var result = await DownloadDocumentByFilePath(downloadFileAbsolute, exportFileName);// Delete tmp file(s)if (!string.IsNullOrEmpty(downloadFileAbsolute) && (downloadFileAbsolute.Contains("TmpFolder")) && File.Exists(downloadFileAbsolute))File.Delete(downloadFileAbsolute);return result;}
文件下载方法DownloadDocumentByFilePath:
public async Task<IActionResult> DownloadDocumentByFilePath(string filePath, string? fileDownloadName = null){if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath)){if (string.IsNullOrEmpty(fileDownloadName)){fileDownloadName = new FileInfo(filePath).Name;}return new FileContentResult(File.ReadAllBytes(filePath), HttpHeaderConstant.RESPONSE_HEADER_CONTENTTYPE_STREAM) { FileDownloadName = fileDownloadName };}else{throw new UserFriendlyException("Not found file");}}
配置文件中的共享路径获取GetFileFromShareFolder
public string GetFileFromShareFolder(string fileName, string? shareFolderPath = null)
{var appsetting = _configuration.GetSection("AppSettings").Get<AppSetting>();// IConfiguration _configurationif (string.IsNullOrEmpty(shareFolderPath)){shareFolderPath = appsettings.DocumentPrefixPath;}string sourcePath = Path.Combine(shareFolderPath, fileName);Log.Information($"GetNoticeFromshareFolderPath: {shareFolderPath}");Log.Information($"GetNoticeFromshareFileName: {fileName}");try{return sourcePath;}catch (Exception ex){Log.Error($"GetFileFromShareFolder failed. File: {sourcePath}. Message: {ex.Message}. Details: {ex.ToString()}", ex);return null;}
}