irc-netcore-api/IRaCIS.Core.API/_PipelineExtensions/IRacisHostFile/MultiDiskStaticFilesMiddlew...

147 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.FileProviders.Physical;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Hosting.Internal;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.VisualBasic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace IRaCIS.Core.API
{
public class MultiDiskStaticFilesMiddleware
{
private readonly RequestDelegate _next;
private readonly IWebHostEnvironment _hostingEnv;
private readonly StaticFileOptions _options;
private readonly ILoggerFactory _loggerFactory;
private string iRaCISDefaultDataFolder = string.Empty;
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, StaticFileOptions options, ILoggerFactory loggerFactory)
{
_next = next;
_hostingEnv = hostingEnv;
_options = options;
_loggerFactory = loggerFactory;
iRaCISDefaultDataFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostingEnv);
if (!Directory.Exists(iRaCISDefaultDataFolder))
{
Directory.CreateDirectory(iRaCISDefaultDataFolder);
}
}
public async Task Invoke(HttpContext context)
{
var path = context.Request.Path.Value;
var isIRacisFile = path.StartsWith($"/{StaticData.Folder.IRaCISDataFolder}");
var isDicomFile = path.Contains($"{StaticData.Folder.DicomFolder}");
var defaultFileProvider = new PhysicalFileProvider(iRaCISDefaultDataFolder);
var staticFileOptions = new StaticFileOptions
{
FileProvider = defaultFileProvider,
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
ServeUnknownFileTypes = true,
DefaultContentType = "application/octet-stream"
};
var defaultRoot = Path.GetPathRoot(iRaCISDefaultDataFolder);
//先从默认里面去找
if (isIRacisFile)
{
if (defaultFileProvider.GetFileInfo(context.Request.Path).Exists)
{
var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
await staticFileMiddleware.Invoke(context);
return;
}
}
//没找到
//dicom影像从多个文件夹尝试因为会存在切换磁盘
if (isDicomFile)
{
var disks = GetDisks().Where(t=>!t.Contains(defaultRoot));
foreach (var item in disks)
{
var otherFileStoreFolder = Path.Combine(item, _hostingEnv.EnvironmentName);
var otherFileProvider= new PhysicalFileProvider(otherFileStoreFolder);
var otherStaticFileOptions = new StaticFileOptions
{
FileProvider = otherFileProvider,
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
ServeUnknownFileTypes = true,
DefaultContentType = "application/octet-stream"
};
if (otherFileProvider.GetFileInfo(context.Request.Path).Exists)
{
var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
await staticFileMiddleware.Invoke(context);
return;
}
}
}
// 如果所有磁盘都不存在所请求的文件,则将请求传递给下一个中间件组件。
await _next.Invoke(context);
}
private string[] GetDisks()
{
// 获取系统中所有可用的磁盘
return DriveInfo.GetDrives()
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed).Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))
.Select(d => d.RootDirectory.FullName)
.ToArray();
}
//private static string GetContentType(string path)
//{
// var provider = new FileExtensionContentTypeProvider();
// if (!provider.TryGetContentType(path, out var contentType))
// {
// contentType = "application/octet-stream";
// }
// return contentType;
//}
//private async Task ServeFileAsync(HttpContext context, IFileInfo fileInfo)
//{
// var response = context.Response;
// response.ContentType = GetContentType(fileInfo.PhysicalPath);
// using (var fileStream = fileInfo.CreateReadStream())
// {
// await fileStream.CopyToAsync(response.Body);
// }
//}
}
}