namespace Govor.API.Services; public class LocalStorageService : IStorageService { private readonly string _storagePath; public LocalStorageService(IWebHostEnvironment hostingEnvironment) { _storagePath = Path.Combine(hostingEnvironment.ContentRootPath, "uploads"); if (!Directory.Exists(_storagePath)) { Directory.CreateDirectory(_storagePath); } } public async Task SaveAsync(byte[] data, string fileName) { if(data is null || data.Length == 0) throw new ArgumentException("Invalid file", nameof(data)); if(fileName is null || fileName.Length == 0) throw new ArgumentException("Invalid file name", nameof(fileName)); var date = DateTime.UtcNow.ToString("yyyy/MM"); var folder = Path.Combine(_storagePath, date); Directory.CreateDirectory(folder); var uniqueFileName = $"{Guid.NewGuid()}_{Path.GetFileName(fileName)}"; var fullPath = Path.Combine(folder, uniqueFileName); await using var stream = new FileStream(fullPath, FileMode.Create); stream.WriteAsync(data, 0, data.Length); return Path.Combine(date, uniqueFileName); } public async Task LoadAsync(string url) { var filePath = Path.Combine(_storagePath, url); if (!File.Exists(filePath)) throw new FileNotFoundException("File not found.", filePath); return new FileStream(filePath, FileMode.Open, FileAccess.Read); } public async Task RemoveAsync(string url) { var path = Path.Combine(_storagePath, url); if (File.Exists(path)) { File.Delete(path); } await Task.CompletedTask; } }