MinIO SDK Using REST API .NET For Amazon S3 Storage and MinIO
Tags: dotnet, objectstorage, amazons3, restapi
Published: 2022-04-13 22:32:20

MinIO SDK Using REST API .NET For Amazon S3 Storage and MinIO
Object storage defined
Object storage is a data storage architecture for large stores of unstructured data. It designates each piece of data as an object, keeps it in a separate storehouse, and bundles it with metadata and a unique identifier for easy access and retrieval.
MinIO
MinIO offers high-performance, S3 compatible object storage.
Native to Kubernetes, MinIO is the only object storage suite available on
every public cloud, every Kubernetes distribution, the private cloud and the
edge. MinIO is software-defined and is 100% open source under GNU AGPL v3.
We will get started by create new .NET 5 project and Create Api ,then we will get to MinIO SDK, after which we will Create Service Minio and run Get and put command object with it.
Github Project : https://github.com/AlexGreatDev/AmazonS3
Create new .NET 5 project
Following commands create a new Web API with .NET 5 CLI:
`#Create the API
dotnet new webapi -o AmazonS3
cd AmazonS3`
Create a new file ObjectController.cs in the Controllers folder . This will add 2 new requests:
POST request at `object/`
GET request at object?objectname=@objectid&bucket=@bucketid
Install MinIO
To install MinIO .NET package, run the following command in Nuget Package Manager Console.
`PM> Install-Package Minio`
Create Service Minio
Create class MinioObject.cs in AmazonS3.Services.Minio Folder.
constructor:
`private MinioClient _minio;
public MinioObject()
{
_minio = new MinioClient()
.WithEndpoint("Address")
.WithCredentials("YOUR-ACCESSKEYID",
"YOUR-SECRETACCESSKEY")
.WithSSL()//if Domain is SSL
.Build();
}`
Put object :
`public async Task<string> PutObj(PutObjectRequest request)
{
var bucketName = request.bucket;
// Check Exists bucket
bool found = await _minio.BucketExistsAsync(new BucketExistsArgs().WithBucket(bucketName));
if (!found)
{
// if bucket not Exists,make bucket
await _minio.MakeBucketAsync(new MakeBucketArgs().WithBucket(bucketName));
}
System.IO.MemoryStream filestream = new System.IO.MemoryStream(request.data);
var filename = Guid.NewGuid();
// upload object
await _minio.PutObjectAsync(new PutObjectArgs()
.WithBucket(bucketName).WithFileName(filename.ToString())
.WithStreamData(filestream).WithObjectSize(filestream.Length)
);
return await Task.FromResult<string>(filename.ToString());
}
Get Object
public async Task<GetObjectReply> GetObject(string bucket, string objectname)
{
MemoryStream destination = new MemoryStream();
// Check Exists object
var objstatreply= await _minio.StatObjectAsync(new StatObjectArgs()
.WithBucket(bucket)
.WithObject(objectname)
);
if (objstatreply == null || objstatreply.DeleteMarker)
throw new Exception(“object not found or Deleted”);
// Get object
await _minio.GetObjectAsync(new GetObjectArgs()
.WithBucket(bucket)
.WithObject(objectname)
.WithCallbackStream((stream) =>
{
stream.CopyTo(destination);
}
)
);
return await Task.FromResult<GetObjectReply>(new GetObjectReply()
{
data = destination.ToArray(),
objectstat = objstatreply
});
}`
Models :
`using Minio.DataModel;
namespace AmazonS3.Services.Minio.Model
{
public class GetObjectReply
{
public ObjectStat objectstat { get; set; }
public byte[] data { get; set; }
}
}`
And
`namespace AmazonS3.Services.Minio.Model
{
public class PutObjectRequest
{
public string bucket { get; set; }
public byte[] data { get; set; }
}
}`
Then add Call Minio Service in ObjectController.cs
`private readonly ILogger<ObjectController> _logger;
private readonly MinioObject _minio;
public ObjectController(ILogger<ObjectController> logger, MinioObject minio)
{
_logger = logger;
_minio = minio;
}
[HttpGet]
public async Task<ActionResult> Get(string objectname, UploadTypeList bucket)
{
var result = await _minio.GetObject(bucket.ToString(), objectname);
return File(result.data, result.objectstat.ContentType);
}
[HttpPost]
public async Task<ActionResult> Post(UploadRequest request)
{
var result = await _minio.PutObj(new Services.Minio.Model.PutObjectRequest()
{
bucket = request.type.ToString(),
data = request.data
});
return Ok(new { filename = result });
}
and Add Minio service in IOC for DI in Startup:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddScoped<MinioObject>();
}`
Summary
Keep in mind that the Service is only available for .NET 5 or Higher. If you would like to use it in .NET Core, you have to use AmazonS3_NetCore Solution.
Here is the repo from the project, I hope you liked it. Happy coding!