.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;
    }
}
相关推荐
二哈喇子!4 分钟前
IDEA启动后控制台不报错,但是页面访问404
java·intellij-idea·mybatis
二哈喇子!4 分钟前
Tomcat下载安装以及配置(详细教程)
java·tomcat·intellij-idea
闻缺陷则喜何志丹5 分钟前
【.NetAPI]统计标注的值、上公差、下公差
数学·.net·cad·netapi
计算机毕设指导66 分钟前
基于微信小程序的健康管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
月月玩代码15 分钟前
OkHttp,Square出品的Java/Android HTTP客户端!
android·java·okhttp
光影少年17 分钟前
next.js与纯react区别
前端·javascript·react.js
胡八一17 分钟前
IntelliJ IDEA 配置插件目录
java·ide·intellij-idea
一念一花一世界18 分钟前
Arbess项目实战 - 基于GitLab搭建.net项目自动化流水线
ci/cd·gitlab·.net·arbess
派大鑫wink20 分钟前
【Day31】Web 开发入门:HTTP 协议详解(请求 / 响应、状态码、请求头)
前端·网络协议·http
资生算法程序员_畅想家_剑魔21 分钟前
Java常见技术分享-分布式篇-SpringCloud-01-基础组件
java·分布式·spring cloud