/// <summary>
/// 上传文件到Minio中
/// </summary>
/// <param name="fileType"></param>
/// <param name="systemName"></param>
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public async Task<List<object>> UpLoadFileToMinio([FromForm] int fileType, [FromForm] string systemName = "")
{
    string bucketName = string.Empty;
    string objectName = string.Empty;
    var files = HttpContext.Request.Form.Files;
    if (files.Where(f => f.Length > 10485760).Count() > 0)
    {
        throw new UserFriendlyException("单个文件大小不能超过10M");
    }
    List<object> list = new List<object>();
    foreach (var formFile in files)
    {
        if (fileType == (int)ImgTypeEnum.ImgLogo)
        {
            bucketName = ImgTypeEnum.ImgLogo.ToString().ToLower();
            objectName = $"{systemName.MDString().ToLower()}{Path.GetExtension(formFile.FileName)}";
        }
        else
        {
            bucketName = ImgTypeEnum.ImgWuLiu.ToString().ToLower();
            objectName = $"{DateTime.Now.ToString("yyyyMMdd")}/{SnowFlakeNew.NewId}{Path.GetExtension(formFile.FileName)}";
        }
        var bucketExistsArgs = new BucketExistsArgs().WithBucket(bucketName);
        if (!await _minioClient.BucketExistsAsync(bucketExistsArgs))
        {
            var makeBucketArgs = new MakeBucketArgs()
                .WithBucket(bucketName)
            .WithLocation("us-east-1"); // Set the location as per your requirement

            await _minioClient.MakeBucketAsync(makeBucketArgs);
            await SetBucketPolicyAsync(bucketName);
        }
        var putObjectArgs = new PutObjectArgs()
            .WithBucket(bucketName)
            .WithObject(objectName)
            .WithStreamData(formFile.OpenReadStream())
            .WithObjectSize(formFile.Length)
            .WithContentType(formFile.ContentType);
        var res = await _minioClient.PutObjectAsync(putObjectArgs);
        var fileUrl = $"http://{_configuration["MinIO:Endpoint"]}/{bucketName}/{objectName}";
        list.Add(new { src = fileUrl, title = objectName, oriFileName = formFile.FileName });
    }
    return list;
}

private async Task SetBucketPolicyAsync(string bucketName)
{
    // 设置桶策略为公开读取 (重要步骤)
    string bucketPolicy = $@"{{
        ""Version"": ""2012-10-17"",
        ""Statement"": [
            {{
                ""Sid"": ""PublicReadGetObject"",
                ""Effect"": ""Allow"",
                ""Principal"": {{ ""AWS"": ""*"" }},
                ""Action"": [ ""s3:GetObject"" ],
                ""Resource"": [ ""arn:aws:s3:::{bucketName}/*"" ]
            }}
        ]
    }}";

    var st = new SetPolicyArgs().WithBucket(bucketName).WithPolicy(bucketPolicy);
    await _minioClient.SetPolicyAsync(st);
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐