115 lines
No EOL
3.6 KiB
C#
115 lines
No EOL
3.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net.Http.Headers;
|
|
using System.Threading.Tasks;
|
|
using Amazon.S3;
|
|
using Amazon.S3.Model;
|
|
using BMA.EHR.Recruit.Service.Core;
|
|
using BMA.EHR.Recruit.Service.Data;
|
|
using BMA.EHR.Recruit.Service.Models.Documents;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace BMA.EHR.Recruit.Service.Services
|
|
{
|
|
public class MinIOService
|
|
{
|
|
#region " Fields "
|
|
|
|
private readonly ApplicationDbContext _context;
|
|
private readonly IConfiguration _configuration;
|
|
private readonly IWebHostEnvironment _webHostEnvironment;
|
|
private readonly AmazonS3Client _s3Client;
|
|
private string _bucketName = string.Empty;
|
|
|
|
#endregion
|
|
|
|
#region " Constructors "
|
|
|
|
public MinIOService(ApplicationDbContext context,
|
|
IConfiguration configuration,
|
|
IWebHostEnvironment webHostEnvironment)
|
|
{
|
|
_context = context;
|
|
_configuration = configuration;
|
|
_webHostEnvironment = webHostEnvironment;
|
|
|
|
var config = new AmazonS3Config
|
|
{
|
|
ServiceURL = _configuration["MinIO:Endpoint"],
|
|
ForcePathStyle = true
|
|
};
|
|
|
|
_s3Client = new AmazonS3Client(_configuration["MinIO:AccessKey"], _configuration["MinIO:SecretKey"], config);
|
|
this._bucketName = _configuration["MinIO:BucketName"] ?? "bma-recruit";
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region " Methods "
|
|
|
|
public async Task<Document> UploadFile(IFormFile file, string newFileName = "")
|
|
{
|
|
var fileName = "";
|
|
var fileExt = Path.GetExtension(file.FileName);
|
|
if (newFileName != "")
|
|
fileName = $"{newFileName}";
|
|
else
|
|
fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');
|
|
|
|
|
|
var tmpDir = Path.Combine(_webHostEnvironment.ContentRootPath, "tmp");
|
|
if (!Directory.Exists(tmpDir))
|
|
Directory.CreateDirectory(tmpDir);
|
|
|
|
var tmpFile = Path.Combine(tmpDir, $"tmp_{DateTime.Now.ToString("ddMMyyyyHHmmss")}{fileExt}");
|
|
|
|
try
|
|
{
|
|
using (var ms = new MemoryStream())
|
|
{
|
|
var id = Guid.NewGuid();
|
|
file.CopyTo(ms);
|
|
var fileBytes = ms.ToArray();
|
|
System.IO.MemoryStream filestream = new System.IO.MemoryStream(fileBytes);
|
|
|
|
var request = new PutObjectRequest
|
|
{
|
|
BucketName = _bucketName,
|
|
Key = id.ToString("D"),
|
|
InputStream = filestream,
|
|
ContentType = file.ContentType,
|
|
CannedACL = S3CannedACL.PublicRead
|
|
};
|
|
|
|
await _s3Client.PutObjectAsync(request);
|
|
|
|
// create document object
|
|
var doc = new Document()
|
|
{
|
|
FileName = fileName,
|
|
FileType = file.ContentType,
|
|
FileSize = Convert.ToInt32(file.Length),
|
|
ObjectRefId = id,
|
|
CreatedDate = DateTime.Now
|
|
};
|
|
|
|
await _context.Documents.AddAsync(doc);
|
|
await _context.SaveChangesAsync();
|
|
|
|
return doc;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
throw;
|
|
}
|
|
finally
|
|
{
|
|
File.Delete(tmpFile);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |