Api/Netina.Infrastructure/Services/StorageService.cs

125 lines
4.1 KiB
C#

using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Enums;
namespace Netina.Infrastructure.Services;
public class StorageService(IOptionsSnapshot<SiteSettings> snapshot) : IStorageService
{
private IAmazonS3? _s3Client;
private readonly string _bucketName = snapshot.Value.StorageSetting.BucketKey;
private readonly string _accessKey = snapshot.Value.StorageSetting.AccessKey;
private readonly string _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<string> 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<string> 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<List<StorageFileSDto>> 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<StorageFileSDto>();
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();
}
}