using NetinaShop.Domain.Dtos.SmallDtos; using NetinaShop.Domain.Enums; namespace NetinaShop.Infrastructure.Services; public class StorageService : IStorageService { private IAmazonS3? _s3Client; private readonly string _bucketName; private readonly string _accessKey; private readonly string _secretKey; public StorageService(IOptionsSnapshot snapshot) { _accessKey = snapshot.Value.StorageSetting.AccessKey; _bucketName = snapshot.Value.StorageSetting.BucketKey; _secretKey = snapshot.Value.StorageSetting.SecretKey; } private IAmazonS3 GetClientAsync() { var awsCredentials = new Amazon.Runtime.BasicAWSCredentials(secretKey: _secretKey, accessKey: _accessKey); var config = new AmazonS3Config { ServiceURL = "https://s3.ir-thr-at1.arvanstorage.ir" }; _s3Client = new AmazonS3Client(awsCredentials, config); return _s3Client; } public async Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, byte[] fileBytes, bool fixName = true) { using var memorySteam = new MemoryStream(fileBytes); var client = GetClientAsync(); if (fixName) { var fileEx = fileName.Split('.').Last(); fileName = fileName.Split('.').First(); fileName = fileName + "_" + StringExtensions.GetId(5) + "_" + DateTime.Today.ToString("yyyy-MM-dd-HH-mm-ss") + "." + fileEx; } var putRequest = new PutObjectRequest { BucketName = _bucketName, Key = Path.Combine(filePath, fileName), ContentType = contentType, InputStream = memorySteam, CannedACL = S3CannedACL.PublicRead, }; putRequest.Metadata.Add("x-amz-meta-title", fileName); PutObjectResponse response = await client.PutObjectAsync(putRequest); return fileName; } public async Task UploadObjectFromFileAsync(string fileName, string filePath, string contentType, Stream fileStream , bool fixName = true) { var client = GetClientAsync(); if (fixName) { var fileEx = fileName.Split('.').Last(); fileName = fileName.Split('.').First(); fileName = fileName + "_" + StringExtensions.GetId(5) + "_" + DateTimeExtensions.DateTimeToUnixTimeStamp(DateTime.Now) + "." + fileEx; } var putRequest = new PutObjectRequest { BucketName = _bucketName, Key = Path.Combine(filePath, fileName), ContentType = contentType, InputStream = fileStream, CannedACL = S3CannedACL.PublicRead }; //putRequest.Metadata.Add("x-amz-meta-title", fileName); PutObjectResponse response = await client.PutObjectAsync(putRequest); return fileName; } public async Task> GetStorageFiles(StorageFileType fileType) { var client = GetClientAsync(); ListObjectsRequest request = new() { BucketName = _bucketName}; switch (fileType) { case StorageFileType.Image: request.Prefix = "Images/Med"; break; case StorageFileType.Video: request.Prefix = "Videos"; break; default: break; } var files = new List(); do { ListObjectsResponse response = await client.ListObjectsAsync(request); // Process the response. foreach (var s3Object in response.S3Objects.Where(s=>s.Size>0)) { files.Add(new StorageFileSDto { FileLocation = s3Object.Key, FileName = s3Object.Key.Split('/').Last() }); } // If the response is truncated, set the marker to get the next // set of keys. if (response.IsTruncated) { request.Marker = response.NextMarker; } else { request = null; } } while (request != null); return files.OrderByDescending(o=>o.CreatedAt).ToList(); } }