188 lines
6.4 KiB
C#
188 lines
6.4 KiB
C#
using IRaCIS.Core.Application.Helper;
|
|
using IRaCIS.Core.Domain.Share;
|
|
using IRaCIS.Core.Infrastructure.Extention;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.Extensions.FileProviders;
|
|
using Microsoft.Extensions.FileProviders.Physical;
|
|
using Microsoft.Extensions.Logging;
|
|
using Newtonsoft.Json;
|
|
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 ILoggerFactory _loggerFactory;
|
|
|
|
private string iRaCISDefaultDataFolder = string.Empty;
|
|
|
|
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, ILoggerFactory loggerFactory)
|
|
{
|
|
_next = next;
|
|
_hostingEnv = hostingEnv;
|
|
_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 = isIRacisFile && path.Contains($"{StaticData.Folder.DicomFolder}");
|
|
|
|
|
|
|
|
//先从默认里面去找
|
|
if (isIRacisFile)
|
|
{
|
|
|
|
|
|
|
|
#region 方式二
|
|
|
|
//var defaultFileProvider = new PhysicalFileProvider(iRaCISDefaultDataFolder);
|
|
|
|
//var staticFileOptions = new StaticFileOptions
|
|
//{
|
|
// FileProvider = defaultFileProvider,
|
|
// RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
|
// ServeUnknownFileTypes = true,
|
|
// DefaultContentType = "application/octet-stream"
|
|
//};
|
|
|
|
//var a = defaultFileProvider.GetFileInfo(context.Request.Path).Exists;
|
|
|
|
//var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
|
|
//await staticFileMiddleware.Invoke(context);
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 文档上传默认会加wwwroot 奇怪...
|
|
|
|
var defaultFileProvider = new PhysicalFileProvider(FileStoreHelper.GetIRaCISRootPath(_hostingEnv));
|
|
|
|
if (defaultFileProvider.GetFileInfo(path).Exists)
|
|
{
|
|
|
|
var actrualPath = defaultFileProvider.GetFileInfo(path).PhysicalPath;
|
|
|
|
await context.Response.SendFileAsync(new PhysicalFileInfo(new FileInfo(actrualPath)));
|
|
|
|
return;
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
|
|
//没找到
|
|
//dicom影像,从多个文件夹尝试,因为会存在切换磁盘
|
|
if (isDicomFile)
|
|
{
|
|
var defaultRoot = Path.GetPathRoot(iRaCISDefaultDataFolder);
|
|
|
|
//除默认部署路径的其他路径
|
|
var disks = DriveInfo.GetDrives()
|
|
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed)/*.Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))*/
|
|
.OrderBy(d => d.AvailableFreeSpace)
|
|
.Select(d => d.RootDirectory.FullName)
|
|
.ToArray().Where(t => !t.Contains(defaultRoot));
|
|
|
|
|
|
foreach (var item in disks)
|
|
{
|
|
var otherFileStoreFolder = Path.Combine(item, _hostingEnv.EnvironmentName);
|
|
|
|
if (!Directory.Exists(otherFileStoreFolder))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
var otherFileProvider = new PhysicalFileProvider(otherFileStoreFolder);
|
|
|
|
|
|
|
|
if (otherFileProvider.GetFileInfo(path).Exists)
|
|
{
|
|
|
|
var actrualPath = otherFileProvider.GetFileInfo(path).PhysicalPath;
|
|
|
|
//方式一
|
|
await context.Response.SendFileAsync(new PhysicalFileInfo(new FileInfo(actrualPath)));
|
|
|
|
#region 方式二 报错 otherFileProvider 应该还包含/{StaticData.Folder.IRaCISDataFolder} 这一层级
|
|
//var otherStaticFileOptions = new StaticFileOptions
|
|
//{
|
|
// FileProvider = otherFileProvider,
|
|
// RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
|
// ServeUnknownFileTypes = true,
|
|
// DefaultContentType = "application/octet-stream"
|
|
//};
|
|
//var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(otherStaticFileOptions), _loggerFactory);
|
|
//await staticFileMiddleware.Invoke(context);
|
|
#endregion
|
|
|
|
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 如果没有找到文件,返回404
|
|
context.Response.StatusCode = 404;
|
|
context.Response.ContentType = "application/json";
|
|
|
|
await context.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("File not found")));
|
|
}
|
|
|
|
|
|
// 如果所有磁盘都不存在所请求的文件,则将请求传递给下一个中间件组件。
|
|
await _next.Invoke(context);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//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);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
|
|
}
|