minio:实现简单上传跟下载(netcore版本)

前言

在上一篇文章《minio:安装部署并安装成windows服务》我们已经简单介绍过minio的基本情况,本文主要介绍如何在netcore webapi项目中如何操作minio。

准备

这里我们要先创建个桶(Bucket),命名为test
在这里插入图片描述

.NET Core集成

这里都是围绕这minio官方提供的.net SDK进行扩展使用,更多详情可以参考官网http://docs.minio.org.cn/docs/master/dotnet-client-quickstart-guide

  • 创建个webapi项目,并添加Minio的NuGet包,这里我选3.1.13版本
    <PackageReference Include="Minio" Version="3.1.13" />
  • 将Minio注入进来,并将minio连接信息配置在appsetting,json文件中
    Startup.cs
        public void ConfigureServices(IServiceCollection services)
        {
            #region minio客户端注入
            var minioClient = new MinioClient(Configuration["MinIO:Endpoint"]
                , Configuration["MinIO:AccessKey"]
                , Configuration["MinIO:SecretKey"]);
            services.AddSingleton(minioClient);
            #endregion
            services.AddControllers();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "MinioDemo.WebApi", Version = "v1" });
            });
        }

appsetting,json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  //minIO配置
  "MinIO": {
    //服务器IP
    "Endpoint": "localhost:9090",
    //账号
    "AccessKey": "minioadmin",
    //密码
    "SecretKey": "12345678",
    //默认存储桶
    "Bucket": "test"
  }
}

  • 完整上传、下载代码
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Minio;
using Minio.Exceptions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace MinioDemo.WebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class MinIOController : ControllerBase
    {
        private static string bucketName = "test";//默认桶

        private readonly MinioClient _client;

        public MinIOController(MinioClient client)
        {
            _client = client;
        }
        /// <summary>
        /// 上传附件
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        [HttpPost("/file/UploadFile")]
        public async Task<dynamic> UploadFile(List<IFormFile> files)
        {
            long size = files.Sum(f => f.Length);
            try
            {
                bool found = await _client.BucketExistsAsync(bucketName);
                //如果桶不存在则创建桶
                if (!found)
                {
                    await _client.MakeBucketAsync(bucketName);
                }
                foreach (var formFile in files)
                {
                    string saveFileName = $"{Guid.NewGuid():N}{Path.GetExtension(formFile.FileName)}";//存储的文件名
                    string objectName = $"/{DateTime.Now:yyyy/MM/dd}/{saveFileName}";//文件保存路径
                    if (formFile.Length > 0)
                    {
                        Stream stream = formFile.OpenReadStream();
                        await _client.PutObjectAsync(bucketName,
                                 objectName,
                                 stream,
                                 formFile.Length,
                                 formFile.ContentType);

                    }
                }
            }
            catch (MinioException e)
            {
                Console.WriteLine("文件上传错误: {0}", e.Message);
            }
            return Ok(new { count = files.Count, size });
        }


        /// <summary>
        /// 下载附件
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        [HttpGet("/file/DownloadFile")]
        public async Task<IActionResult> DownloadFile(string fileName)
        {
            var memoryStream = new MemoryStream();

            try
            {
                await _client.StatObjectAsync(bucketName, fileName);
                await _client.GetObjectAsync(bucketName, fileName,
                                    (stream) =>
                                    {
                                        stream.CopyTo(memoryStream);
                                    });
                memoryStream.Position = 0;

            }
            catch (MinioException e)
            {
                Console.Out.WriteLine("下载附件发生错误: " + e);
            }
            return File(memoryStream, GetContentType(fileName));

        }
        private static string GetContentType(string fileName)
        {
            if (fileName.Contains(".jpg"))
            {
                return "image/jpg";
            }
            else if (fileName.Contains(".jpeg"))
            {
                return "image/jpeg";
            }
            else if (fileName.Contains(".png"))
            {
                return "image/png";
            }
            else if (fileName.Contains(".gif"))
            {
                return "image/gif";
            }
            else if (fileName.Contains(".pdf"))
            {
                return "application/pdf";
            }
            else
            {
                return "application/octet-stream";
            }
        }
    }
}

测试

上传测试,这里我用swagger执行测试UploadFile
在这里插入图片描述
minio控制台,成功
在这里插入图片描述
下载测试,这里直接拿刚刚上传成功的附件进行测试
在这里插入图片描述

扩展:更改访问策略,实现直接打开浏览文件

如果想要通过url地址直接打开文件,只需要改访问策略
进入minio控制台=》Buckets=>Manage=>Access Policy: Public
在这里插入图片描述
直接输入地址测试
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello,Mr.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值