79 lines
2.5 KiB
C#
79 lines
2.5 KiB
C#
using System.Security.Cryptography;
|
|
using Microsoft.Extensions.Options;
|
|
using Minio;
|
|
using Minio.DataModel.Args;
|
|
|
|
public class DocumentStorageService : IDocumentStorageService
|
|
{
|
|
private readonly IMinioClient _minio;
|
|
private readonly MinioOptions _options;
|
|
|
|
public DocumentStorageService(IMinioClient minio, IOptions<MinioOptions> options)
|
|
{
|
|
_minio = minio;
|
|
_options = options.Value;
|
|
}
|
|
|
|
public async Task<(string objectKey, string sha256, long fileSize)> UploadAsync(
|
|
Stream fileStream, string contentType, Guid batchId)
|
|
{
|
|
var now = DateTimeOffset.UtcNow;
|
|
using var sha256 = SHA256.Create();
|
|
using var memStream = new MemoryStream();
|
|
|
|
await fileStream.CopyToAsync(memStream);
|
|
memStream.Position = 0;
|
|
|
|
var hashBytes = sha256.ComputeHash(memStream);
|
|
var hashHex = Convert.ToHexString(hashBytes).ToLowerInvariant();
|
|
memStream.Position = 0;
|
|
|
|
var extension = contentType switch
|
|
{
|
|
"application/pdf" => "pdf",
|
|
"image/jpeg" => "jpg",
|
|
"image/png" => "png",
|
|
_ => "bin"
|
|
};
|
|
|
|
var objectKey = $"scans/{now.Year}/{now.Month:D2}/{batchId}/{hashHex}.{extension}";
|
|
|
|
await EnsureBucketAsync();
|
|
|
|
await _minio.PutObjectAsync(new PutObjectArgs()
|
|
.WithBucket(_options.BucketName)
|
|
.WithObject(objectKey)
|
|
.WithStreamData(memStream)
|
|
.WithObjectSize(memStream.Length)
|
|
.WithContentType(contentType));
|
|
|
|
return (objectKey, hashHex, memStream.Length);
|
|
}
|
|
|
|
public async Task<string> GetPresignedUrlAsync(string objectKey)
|
|
{
|
|
return await _minio.PresignedGetObjectAsync(new PresignedGetObjectArgs()
|
|
.WithBucket(_options.BucketName)
|
|
.WithObject(objectKey)
|
|
.WithExpiry(_options.PresignedUrlExpiryMinutes * 60));
|
|
}
|
|
|
|
public async Task<Stream> DownloadAsync(string objectKey)
|
|
{
|
|
var memStream = new MemoryStream();
|
|
await _minio.GetObjectAsync(new GetObjectArgs()
|
|
.WithBucket(_options.BucketName)
|
|
.WithObject(objectKey)
|
|
.WithCallbackStream(stream => stream.CopyTo(memStream)));
|
|
|
|
memStream.Position = 0;
|
|
return memStream;
|
|
}
|
|
|
|
private async Task EnsureBucketAsync()
|
|
{
|
|
var exists = await _minio.BucketExistsAsync(new BucketExistsArgs().WithBucket(_options.BucketName));
|
|
if (!exists)
|
|
await _minio.MakeBucketAsync(new MakeBucketArgs().WithBucket(_options.BucketName));
|
|
}
|
|
} |