.NET 6 文件下载

发布于:2025-09-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

.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)
                    {
                        //zip
                        fileExtend = ".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 compression
                            byte[] 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 _configuration
    if (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;
    }
}