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); // } //} } }