.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;
}
}