Asp.Net Core MinIo kullanımı
Minio Nedir?
MinIO, Amazon S3 uyumlu server taraflı bir yazılım depolama aracıdır, resim, video, log dosyaları, yedekleme vb. veri türlerini depolamaya yarar.
Geliştirme yaptığım ortam
- Windows 10
- Asp.net Core 3.1
MinIo’yu yükleme ve ayağa kaldırma işlemleri
Öncelikle şu linkten minIo’yu indiriyoruz. Mevcut link windows için çalışmakta linux ve macos gibi platformlar için şu linkten yararlanabilirsiniz.
MinIo’yu indirdikten sonra yüklenen konumdan cmd’yi çalıştırıyoruz. Exenin olduğu klasörde test adında bir alt klasör açtım dosyaları buraya yüklenecek.
minio default olarak kullanıcı adını ve şifresini minioadmin olarak ayarlıyor. Şifreyi değiştirmek için aşağıdaki komutları kullanabilirsiniz
1 2 |
set MINIO_ROOT_USER=admin set MINIO_ROOT_PASSWORD=12345678 |
MinIo aşağıdaki komut ile ayağa kalkacaktır.
1 |
minio.exe server \test |
127.0.0.1:9000 adresinden MinIoya erişebilirsiniz
Minio’ya testbucket adında bucket ekliyoruz.

.Net Core Projelerinde Kullanımı
İlk olarak Amazon.S3 SDK kurulumu yapalım.
1 |
Install-Package AWSSDK.S3 |
appsettings.json‘a minio ayarlarımızı kaydedelim
1 2 3 4 5 6 |
"MinioAccessInfo": { "SecretKey": "admin", "Password": "12345678", "EndPoint": "http://127.0.0.1:9000", "BucketName": "testbucket" } |
Dosya yükleme ve getirme işlemini yapacak servisi yazalım
1 2 3 4 5 |
public interface IFileOperation { Task<string> UploadFile(IFormFile file); string GetFile(string key); } |
FileOperation classının constructor’ında ilgili ayarlarımızla beraber clientı oluşturalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class FileOperation:IFileOperation { private IConfiguration Configuration { get; set; } private ILogger<FileOperation> Logger { get; set; } private string minioSecretkey => Configuration["MinioAccessInfo:SecretKey"]; private string minIoPassword => Configuration["MinioAccessInfo:Password"]; private string minIoEndPoint => Configuration["MinioAccessInfo:EndPoint"]; private string bucketName => Configuration["MinioAccessInfo:BucketName"]; private readonly AmazonS3Client _client; public FileOperation(IConfiguration Configuration,ILogger<FileOperation> logger) { this.Configuration = Configuration; this.Logger = logger; var config = new AmazonS3Config { RegionEndpoint = RegionEndpoint.GetBySystemName("us-east-1"), ServiceURL = minIoEndPoint, ForcePathStyle = true, SignatureVersion = "2" }; _client = new AmazonS3Client(minioSecretkey, minIoPassword, config); } |
Dosya Yükleme Metotu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public async Task<string> UploadFile(IFormFile file) { var key = String.Empty; try { key = Guid.NewGuid().ToString(); var stream = file.OpenReadStream(); var request = new PutObjectRequest() { BucketName = bucketName, InputStream = stream, AutoCloseStream = true, Key = key, ContentType = file.ContentType }; var encodedFilename = Uri.EscapeDataString(file.FileName); request.Metadata.Add("original-filename", encodedFilename); request.Headers.ContentDisposition = $"attachment; filename=\"{encodedFilename}\""; await _client.PutObjectAsync(request); } catch (Exception e) { Logger.LogError("Error ocurred In UploadFileAsync", e); } return key; } |
Kaydedeceğimiz her dosyanın bir unique(eşşiz) bir ismi olmalı, dosya ismini veritabınında tuttuğumuz için keye direkt guid atatım isterseniz guid ile dosyanın ismini karıştırıp kaydedebilirsiniz.
Dosyayı çağırma metotu:
1 2 3 4 5 6 7 8 9 10 11 |
public string GetFile(string key) { if (string.IsNullOrEmpty(key)) return null; return _client.GetPreSignedURL(new GetPreSignedUrlRequest() { BucketName = bucketName, Key = key, Expires = DateTime.Now.AddMinutes(30) }); } |
İligli servisleri kullanmadan önce startup.cs’ye kaydedelim

Basit bir UI ile dosya yükleme ve görüntüleme işlemleri yapalım
Entity:
File adında bir entity ile dosyanın ismi, keyi ve türünü tutuyoruz.
1 2 3 4 5 6 7 |
public class File { [Key] public string Key { get; set; } public string Name { get; set; } public string ContentType { get; set; } } |
Controller:
1 2 3 4 |
public async Task<IActionResult> Index() { return View(); } |
View:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@model MostUsedLibraries.Domain.ViewModels.FileUploadViewModel <div class="panel"> <form enctype="multipart/form-data" method="post" class="form"> <dl> <dt> <label asp-for="File"></label> </dt> <dd> <input asp-for="File" type="file"> </dd> </dl> <input asp-page-handler="Upload" class="btn btn-success" type="submit" value="Dosyayı Sisteme Yükle"> </form> </div> <br /> <br /> <a class="btn btn-primary" href="home/allImages">Yüklü Resimleri gör</a> <br /> <br /> <a class="btn btn-secondary" href="home/allpdf">Yüklü Pdfleri gör</a> |
Post Controller:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[HttpPost] public async Task<IActionResult> Index(IFormFile file) { var key = await FileOperation.UploadFile(file); var entity = new File { ContentType = file.ContentType, Key = key, Name = file.FileName }; Db.Add(entity); Db.SaveChanges(); return View(); } |
bu işlemler ile başarılı bir şekilde dosyalarımızı yükledik. Şimdi de görüntüleme işlemine bakalım
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public IActionResult AllImages() { var images = Db.Files.Where(f => f.ContentType == "image/png").ToList(); var files = new List<string>(); images.ForEach(im => files.Add(FileOperation.GetFile(im.Key).Replace("https","http"))); return View(files); } public IActionResult AllPdf() { var images = Db.Files.Where(f => f.ContentType == "application/pdf").ToList(); var files = new Dictionary<string,string>(); images.ForEach(im => files.Add(FileOperation.GetFile(im.Key), im.Name)); return View(files); } |
İki adet ActionResultımızı var biri AllImages(), türü png olan resimleri listeliyor, diğeri AllPdf() ise türü pdf olan dosyaları listeliyor
AllImages View:
1 2 3 4 5 6 7 8 9 |
@model List<string> <h3>Yüklü Resimler</h3> <br /> @foreach (var item in Model) { <img src="@item" alt="Alternate Text" /> <br /> <br /> } |
AllPdf View:
1 2 3 4 5 6 7 8 9 |
@model Dictionary<string, string> <h3>Yüklü Pdf listesi</h3> <br /> @foreach (var item in Model) { <a href="@item.Key.Replace("https","http")">@item.Value</a> <br /> <br /> } |


Başka bir yazıda görüşmek üzere 🙂