.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;
    }
}
相关推荐
段ヤシ.8 小时前
回顾Java知识点,面试题汇总Day12(持续更新)
java·mybatis
why技术8 小时前
AI Coding开始进入第四个时代,我还没上车呢!
前端·人工智能·后端
java1234_小锋8 小时前
Spring AI 2.0 开发Java Agent智能体 - MCP(模型上下文协议)
java·人工智能·spring·spring ai
seven97_top8 小时前
两小时入门Sentinel
java·sentinel
叶小鸡8 小时前
Java 篇-项目实战-AI 天机学堂(从 0 到 1)-day1
java·开发语言
bigbearxyz8 小时前
Caused by: java.net.SocketException: Connection reset问题排查
java·keepalived·proxysql
大家的林语冰9 小时前
CSS 已死?DOM 性能黑洞!Pretext 排版革命让你在文本间跳舞,没有 DOM 也能纵享丝滑~
前端·javascript·css
vipbic9 小时前
我也该升级了,陪伴了我7年的博客
前端
Lee川9 小时前
RAG 实战:从一篇掘金文章出发,拆解检索增强生成的全链路
前端·人工智能·后端
Lee川9 小时前
MCP 高德地图实战:当 AI 学会使用工具,一个协议如何重塑大模型的行动边界
前端·人工智能·后端