目录
最近在进行一个图片的上传功能实现,我选用的免费的Minio来实现这个功能,具体步骤如下:
一. Minio的基本使用
1. 下载Minio
https://min.io/download#/agpl-windowshttps://min.io/download#/agpl-windows
2. 启动Minio
前面将Minio下载到自己想要保存的位置,此时文件内会出现一个minio.exe文件
我们在该路径下启动cmd, 输入 minio.exe server 数据存储地址
图片中包含了输出指令,访问地址已经访问账号和密码,我们随便点击一个输入账号密码就可以进入到minio的控制台.
二. .Net Core中使用minio
1. 下载Nuget包 Minio
2. 配置信息以及注入
为了方便后期更改,我选择在appsettings.json中进行配置
// minio配置
"MinIO": {
"Endpoint": "127.0.0.1:9000",
"AccessKey": "minioadmin",
"SecretKey": "minioadmin"
}
注入Minio服务
var minio = builder.Configuration.GetSection("MinIO");
builder.Services.AddSingleton(new MinioClient()
.WithEndpoint(minio["Endpoint"])
.WithCredentials(minio["AccessKey"], minio["SecretKey"])
.Build());
3. 图片上传Service层
/// <summary>
/// 上传图片
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
/// <exception cref="ApplicationException"></exception>
public async Task<string> uploadFile(IFormFile file)
{
try
{
var beArgs = new BucketExistsArgs().WithBucket(bucketName);
bool found = await _minioClient.BucketExistsAsync(beArgs).ConfigureAwait(false);
//创建bucket
if (!found)
{
var mbArgs = new MakeBucketArgs().WithBucket(bucketName);
await _minioClient.MakeBucketAsync(mbArgs).ConfigureAwait(false);
}
//获取上传存储地址和文件名
string fileName = $"{Guid.NewGuid():N}{Path.GetExtension(file.FileName)}";
string objectName = $"/{DateTime.Now:yyyy/MM/dd}/{fileName}";
//获取上传文件输入流
Stream stream = file.OpenReadStream();
//上传文件
var putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithStreamData(stream)
.WithObjectSize(file.Length)
.WithContentType(file.ContentType);
await _minioClient.PutObjectAsync(putObjectArgs).ConfigureAwait(false);
// 获取文件在minio的路径
string imageUrl = "http://127.0.0.1:9000/computerclub" + objectName;
return imageUrl;
}
catch (Exception ex)
{
// 处理异常
throw new ApplicationException("文件上传失败", ex);
}
}
4. 接口编写
[Route("api/[controller]")]
[ApiController]
public class FileUploadsController : ControllerBase
{
// 桶名
private static string bucketName = "computerclub";
private readonly IMInioFileService _service;
public FileUploadsController(IMInioFileService service)
{
_service = service;
}
/// <summary>
/// 上传图片
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
[HttpPost("fileUpload")]
public async Task<IActionResult> UploadFile(IFormFile file)
{
var result = await _service.uploadFile(file);
return Ok(result);
}
}
此时运行项目上传图片:
上次完成后我们在minio控制台可以看到我们的图片上传成功了,并且在本地的minio的data中保存了相关信息
此时我们可以直接使用图片生成的连接在浏览器直接访问图片
到此上传图片的功能就实现啦