|
1 | | -using Microsoft.Extensions.Options; |
| 1 | +using Amazon.S3; |
| 2 | +using Amazon.S3.Model; |
| 3 | +using Microsoft.Extensions.Options; |
| 4 | +using Our.Umbraco.StorageProviders.AWSS3.IO; |
2 | 5 | using SixLabors.ImageSharp.Web; |
3 | 6 | using SixLabors.ImageSharp.Web.Caching; |
4 | 7 | using SixLabors.ImageSharp.Web.Caching.AWS; |
5 | 8 | using SixLabors.ImageSharp.Web.Resolvers; |
| 9 | +using SixLabors.ImageSharp.Web.Resolvers.AWS; |
| 10 | +using Umbraco.Community.FileSystemProviders.B2.Models; |
6 | 11 |
|
7 | 12 | namespace Umbraco.Community.FileSystemProviders.B2; |
8 | 13 |
|
9 | | -public class B2FileSystemImageCache(IOptions<AWSS3StorageCacheOptions> options) : IImageCache |
| 14 | +public class B2FileSystemImageCache( |
| 15 | + IOptions<AWSS3StorageCacheOptions> options, |
| 16 | + IOptions<B2Options> b2Options, |
| 17 | + IAWSS3FileSystemProvider fileSystemProvider) |
| 18 | + : IImageCache |
10 | 19 | { |
11 | | - private readonly AWSS3StorageCache _baseCache = new(options); |
| 20 | + private readonly IAmazonS3 _client = fileSystemProvider.GetFileSystem(Constants.Aliases.MediaFileSystem).GetS3Client(""); |
12 | 21 |
|
13 | | - public async Task<IImageCacheResolver?> GetAsync(string key) => |
14 | | - await _baseCache.GetAsync(Path.Combine("cache/", key)); |
| 22 | + public virtual async Task<IImageCacheResolver?> GetAsync(string key) |
| 23 | + { |
| 24 | + var request = new GetObjectMetadataRequest |
| 25 | + { |
| 26 | + BucketName = b2Options.Value.BucketName, |
| 27 | + Key = key |
| 28 | + }; |
15 | 29 |
|
16 | | - public async Task SetAsync(string key, Stream stream, ImageCacheMetadata metadata) => |
17 | | - await _baseCache.SetAsync(Path.Combine("cache/", key), stream, metadata); |
| 30 | + try |
| 31 | + { |
| 32 | + // HEAD request throws a 404 if not found. |
| 33 | + var metadata = (await _client.GetObjectMetadataAsync(request)).Metadata; |
| 34 | + return new AWSS3StorageCacheResolver(_client, b2Options.Value.BucketName, key, metadata); |
| 35 | + } |
| 36 | + catch |
| 37 | + { |
| 38 | + return null; |
| 39 | + } |
| 40 | + } |
| 41 | + |
| 42 | + |
| 43 | + public virtual async Task SetAsync(string key, Stream stream, ImageCacheMetadata metadata) |
| 44 | + { |
| 45 | + var request = new PutObjectRequest |
| 46 | + { |
| 47 | + BucketName = options.Value.BucketName, |
| 48 | + Key = key, |
| 49 | + ContentType = metadata.ContentType, |
| 50 | + InputStream = stream, |
| 51 | + AutoCloseStream = false, |
| 52 | + DisablePayloadSigning = b2Options.Value.Experimental.DisablePayloadSigning |
| 53 | + }; |
| 54 | + |
| 55 | + foreach (KeyValuePair<string, string> d in metadata.ToDictionary()) |
| 56 | + { |
| 57 | + request.Metadata.Add(d.Key, d.Value); |
| 58 | + } |
| 59 | + |
| 60 | + await _client.PutObjectAsync(request); |
| 61 | + } |
18 | 62 | } |
0 commit comments