114 lines
3.8 KiB
C#
114 lines
3.8 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();
|
|
ListObjectsV2Request request = new() { BucketName = _bucketName, MaxKeys = 3000 };
|
|
switch (fileType)
|
|
{
|
|
case StorageFileType.Image:
|
|
request.Prefix = "Images/Med";
|
|
break;
|
|
case StorageFileType.Video:
|
|
request.Prefix = "Videos";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
var pagination = client.Paginators.ListObjectsV2(request);
|
|
var s3Files = new List<S3Object>();
|
|
await foreach (var listObjectsV2Response in pagination.Responses)
|
|
{
|
|
s3Files.AddRange(listObjectsV2Response.S3Objects);
|
|
}
|
|
|
|
var files = s3Files
|
|
.OrderByDescending(s => s.LastModified)
|
|
.Take(100)
|
|
.Select(s => new StorageFileSDto
|
|
{
|
|
FileLocation = s.Key,
|
|
FileName = s.Key.Split('/').Last()
|
|
}).ToList();
|
|
|
|
return files.ToList();
|
|
}
|
|
} |