73 lines
2.5 KiB
C#
73 lines
2.5 KiB
C#
using Dlhis.Common.FileOperation.Configurations;
|
|
using Kurisu.AspNetCore.Utils.Extensions;
|
|
using Microsoft.Extensions.Options;
|
|
using Minio;
|
|
using Minio.DataModel.Args;
|
|
|
|
namespace Dlhis.Common.FileOperation.Services.Implements;
|
|
|
|
public class MinioService : IMinioService
|
|
{
|
|
private readonly IMinioClient _client;
|
|
|
|
public MinioService(IMinioClient client, IOptions<MinIOOptions> options)
|
|
{
|
|
_client = client;
|
|
}
|
|
|
|
public async Task<bool> ExistsBucketAsync(string bucket)
|
|
{
|
|
var args = new BucketExistsArgs().WithBucket(bucket);
|
|
return await _client.BucketExistsAsync(args);
|
|
}
|
|
|
|
|
|
public async Task CreateBucketIfNotExistsAsync(string bucket)
|
|
{
|
|
if (!await ExistsBucketAsync(bucket))
|
|
{
|
|
var policy = "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::BUCKETNAME\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::BUCKETNAME/*\"]}]}".Replace("BUCKETNAME", bucket);
|
|
|
|
await _client.MakeBucketAsync(new MakeBucketArgs().WithBucket(bucket));
|
|
await _client.SetPolicyAsync(new SetPolicyArgs().WithBucket(bucket).WithPolicy(policy));
|
|
}
|
|
}
|
|
|
|
|
|
public async Task<bool> ExistsFileAsync(string bucket, string objectName)
|
|
{
|
|
try
|
|
{
|
|
var obj = new StatObjectArgs().WithBucket(bucket).WithObject(objectName);
|
|
var objStat = await _client.StatObjectAsync(obj);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public async Task<string> UploadFileAsync(string bucket, IFormFile formFile)
|
|
{
|
|
formFile.ThrowIfNull("请选择文件上传!");
|
|
|
|
await CreateBucketIfNotExistsAsync(bucket);
|
|
|
|
var ms = DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
|
var fileName = Path.GetFileNameWithoutExtension(formFile.FileName) + "_" + ms + Path.GetExtension(formFile.FileName);
|
|
fileName = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{fileName}";
|
|
|
|
var response = await _client.PutObjectAsync(new PutObjectArgs().WithBucket(bucket)
|
|
.WithObject(fileName)
|
|
.WithObjectSize(formFile.Length)
|
|
.WithStreamData(formFile.OpenReadStream())
|
|
.WithContentType(formFile.ContentType)
|
|
.WithVersionId(bucket)
|
|
);
|
|
|
|
return $"/{bucket}/{response.ObjectName}";
|
|
}
|
|
}
|