修改影响上传 切换磁盘预提交

This commit is contained in:
2023-04-26 18:27:00 +08:00
parent 6a7971f314
commit 8c43bcf030
14 changed files with 455 additions and 109 deletions
@@ -1,10 +1,12 @@
using IRaCIS.Core.Domain.Share;
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;
@@ -24,12 +26,21 @@ namespace IRaCIS.Core.API
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)
@@ -39,52 +50,96 @@ namespace IRaCIS.Core.API
var isDicomFile = path.Contains($"{StaticData.Folder.DicomFolder}");
var isFind = false;
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 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);
}
}
private string[] GetDisks()
{
// 获取系统中所有可用的磁盘
return DriveInfo.GetDrives()
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed)
.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 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);
// }
//}
}