feat: ImageStorageService

This commit is contained in:
2026-02-26 07:50:15 +03:00
parent 2c24b9e3d5
commit 6bbe0d7e09
3 changed files with 90 additions and 0 deletions
+11
View File
@@ -3,6 +3,7 @@ using Microsoft.IdentityModel.Protocols.Configuration;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using GSS2.Core.Hardware;
using GSS2.Core.Analysis.AmineContent.Database;
@@ -76,6 +77,16 @@ public static class DependencyInjectionHelper
);
public static IServiceCollection AddComputeResourcesService(this IServiceCollection services) => services
.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
.AddDbContext<AmineContentCalibrationContext>(
+78
View File
@@ -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);
}
}