using Amazon.S3; using Amazon.S3.Model; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace Sony.Filtr.Core.Factory { public class StorageFactory { private readonly AmazonS3Client _s3Client; public StorageFactory(AmazonS3Client s3Client) { _s3Client = s3Client; } public void DeleteObject(string fileName, string bucketName) { var deleteRequest = new DeleteObjectRequest {BucketName = bucketName, Key = fileName}; _s3Client.DeleteObjectAsync(deleteRequest); } public async Task DeleteObjectAsync(string bucketName, string filePath) { var deleteRequest = new DeleteObjectRequest { BucketName = bucketName, Key = filePath }; await _s3Client.DeleteObjectAsync(deleteRequest); } public void PutObject(string fileName, string bucketName, Stream stream) { var putRequest = BuildPutRequest(fileName, bucketName, stream); _s3Client.PutObjectAsync(putRequest); } public async Task ListObjectsAsync(string bucketName) { var listRequest = BuildListRequest(bucketName); return await _s3Client.ListObjectsAsync(listRequest); } public async Task PutObjectAsync(string fileName, string bucketName, Stream stream) { var putRequest = BuildPutRequest(fileName, bucketName, stream); return await _s3Client.PutObjectAsync(putRequest); } private static PutObjectRequest BuildPutRequest(string fileName, string bucketName, Stream stream) { PutObjectRequest putRequest = new PutObjectRequest { BucketName = bucketName, Key = fileName, InputStream = stream, CannedACL = S3CannedACL.Private }; return putRequest; } private static ListObjectsRequest BuildListRequest(string bucketName) { var listRequest = new ListObjectsRequest { BucketName = bucketName }; return listRequest; } public Stream GetObject(string filename, string bucketName) { GetObjectRequest getRequest = new GetObjectRequest {BucketName = bucketName, Key = filename}; try { var getResp = _s3Client.GetObjectAsync(getRequest).Result; var memoryStream = new MemoryStream(); getResp.ResponseStream.CopyTo(memoryStream); getResp.ResponseStream.Close(); memoryStream.Position = 0; return memoryStream; } catch (Exception) { return null; } } public async Task GetObjectAsync(string filename, string bucketName) { GetObjectRequest getRequest = new GetObjectRequest { BucketName = bucketName, Key = filename }; try { var getResp = await _s3Client.GetObjectAsync(getRequest); var memoryStream = new MemoryStream(); await getResp.ResponseStream.CopyToAsync(memoryStream); getResp.ResponseStream.Close(); memoryStream.Position = 0; return memoryStream; } catch (Exception) { return null; } } public async Task> GetObjectsAsync(string bucketName, string directory) { var getResp = await _s3Client.ListObjectsAsync(new ListObjectsRequest() { BucketName = bucketName, Prefix = directory, Delimiter = "/" }); return getResp.S3Objects.Where(p=> p.Size > 0).Select(s => s.Key).ToList(); } public async Task CopyObjectAsync(string bucketName, string filePath, string destinationPath) { var response = await _s3Client.CopyObjectAsync(new CopyObjectRequest() { SourceBucket = bucketName, DestinationBucket = bucketName, SourceKey = filePath, DestinationKey = destinationPath }); } } }