.NET 6 文件下载

.NET 6 API中实现文件的下载。

创建HttpHeaderConstant用于指定http头。

cs 复制代码
 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进行压缩包处理,可以指定压缩等级。

cs 复制代码
        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:

cs 复制代码
 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

cs 复制代码
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;
    }
}
相关推荐
JeffongTan6 小时前
在LWC中镶嵌VF Page获取用户IP
前端·javascript·salesforce
phltxy7 小时前
C语言操作符详解
java·c语言·算法
步行cgn8 小时前
@Configuration 详解:Spring 配置类的核心注解
java·后端·spring
sunshine22 girl8 小时前
Java学习一 环境配置2 安装和基本使用Idea
java·学习·intellij-idea
陆枫Larry9 小时前
Astro 是什么
前端
嘿嘿-6610 小时前
Windows 一键使用 GPT-6 Astra:Codex CLI 配置教程
java·人工智能·windows·gpt·chatgpt·web
是立不是利10 小时前
写给设计师的 CSS 博客美学指南
前端·css
默_笙11 小时前
🏝 Docker 就是"房地产开发":从施工图纸到小区物业的容器化指南
前端·javascript
计算机魔术师11 小时前
Rohan Paul 谈用时间跨度衡量智能体能力,并引用 OpenAI 自动化研究实习生里程碑
前端
kyriewen11 小时前
我手写了个极简版 React Router——才搞懂 v6 为什么砍了这么多 API
前端·javascript·程序员