forked from amkovkov/GranuSightSoftware2
feat: ImageStorageService
This commit is contained in:
@@ -3,6 +3,7 @@ using Microsoft.IdentityModel.Protocols.Configuration;
|
|||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
using GSS2.Core.Hardware;
|
using GSS2.Core.Hardware;
|
||||||
using GSS2.Core.Analysis.AmineContent.Database;
|
using GSS2.Core.Analysis.AmineContent.Database;
|
||||||
|
|
||||||
@@ -76,6 +77,16 @@ public static class DependencyInjectionHelper
|
|||||||
);
|
);
|
||||||
public static IServiceCollection AddComputeResourcesService(this IServiceCollection services) => services
|
public static IServiceCollection AddComputeResourcesService(this IServiceCollection services) => services
|
||||||
.AddSingleton<ComputeResourcesService>();
|
.AddSingleton<ComputeResourcesService>();
|
||||||
|
public static IServiceCollection AddImageStorageService(this IServiceCollection services, DirectoryInfo rootDirectory) => services
|
||||||
|
.AddSingleton<ImageStorageService>(
|
||||||
|
serviceProvider =>
|
||||||
|
{
|
||||||
|
var logger = serviceProvider.GetService<ILogger<ImageStorageService>>();
|
||||||
|
if (logger is null)
|
||||||
|
throw new Exception("Cannot get logger");
|
||||||
|
return new ImageStorageService(logger, rootDirectory);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
public static IServiceCollection AddAmineContentCalibrationContext(this IServiceCollection services, IConfigurationManager configuration) => services
|
public static IServiceCollection AddAmineContentCalibrationContext(this IServiceCollection services, IConfigurationManager configuration) => services
|
||||||
.AddDbContext<AmineContentCalibrationContext>(
|
.AddDbContext<AmineContentCalibrationContext>(
|
||||||
|
|||||||
@@ -0,0 +1,78 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
|
namespace GSS2.Core.Hardware;
|
||||||
|
|
||||||
|
public class ImageStorageService
|
||||||
|
{
|
||||||
|
private readonly ILogger<ImageStorageService> _logger;
|
||||||
|
private readonly DirectoryInfo _rootDirectory;
|
||||||
|
|
||||||
|
public ImageStorageService(ILogger<ImageStorageService> logger, DirectoryInfo rootDirectory)
|
||||||
|
{
|
||||||
|
_logger = logger;
|
||||||
|
_logger.LogInformation("Initialization");
|
||||||
|
|
||||||
|
_rootDirectory = rootDirectory;
|
||||||
|
if (!_rootDirectory.Exists)
|
||||||
|
{
|
||||||
|
_rootDirectory.Create();
|
||||||
|
_logger.LogInformation("Created directory: {}", _rootDirectory.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("Initialized");
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> SaveAsync(Stream fileStream, string extension, CancellationToken ct = default)
|
||||||
|
{
|
||||||
|
var fileName = GenerateFileName(extension);
|
||||||
|
var fullPath = GetFullPath(fileName);
|
||||||
|
|
||||||
|
var directory = Path.GetDirectoryName(fullPath)!;
|
||||||
|
Directory.CreateDirectory(directory);
|
||||||
|
|
||||||
|
await using var file = new FileStream(
|
||||||
|
fullPath,
|
||||||
|
FileMode.CreateNew,
|
||||||
|
FileAccess.Write,
|
||||||
|
FileShare.None,
|
||||||
|
81920,
|
||||||
|
useAsync: true);
|
||||||
|
|
||||||
|
await fileStream.CopyToAsync(file, ct);
|
||||||
|
|
||||||
|
_logger.LogInformation("File saved: {FileName}", fileName);
|
||||||
|
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Stream OpenRead(string fileName)
|
||||||
|
{
|
||||||
|
var fullPath = GetFullPath(fileName);
|
||||||
|
return new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Delete(string fileName)
|
||||||
|
{
|
||||||
|
var fullPath = GetFullPath(fileName);
|
||||||
|
|
||||||
|
if (!File.Exists(fullPath))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
File.Delete(fullPath);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GenerateFileName(string extension)
|
||||||
|
{
|
||||||
|
var guid = Guid.NewGuid().ToString("N");
|
||||||
|
return $"{guid}{extension}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetFullPath(string fileName)
|
||||||
|
{
|
||||||
|
var level1 = fileName.Substring(0, 2);
|
||||||
|
var level2 = fileName.Substring(2, 2);
|
||||||
|
|
||||||
|
return Path.Combine(_rootDirectory.FullName, level1, level2, fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,6 +71,7 @@ public partial class Program
|
|||||||
builder.Services.AddIlluminatorService("Hardware:Illuminator");
|
builder.Services.AddIlluminatorService("Hardware:Illuminator");
|
||||||
builder.Services.AddCameraService("Hardware:Camera", true);
|
builder.Services.AddCameraService("Hardware:Camera", true);
|
||||||
builder.Services.AddComputeResourcesService();
|
builder.Services.AddComputeResourcesService();
|
||||||
|
builder.Services.AddImageStorageService(new DirectoryInfo("images"));
|
||||||
|
|
||||||
builder.Services.AddViewsAndModels();
|
builder.Services.AddViewsAndModels();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user