This is a library for storing files in small chunks on sql using EntityFrameworkCore. Works well with Entity Framework as an extension.
Install-Package Files.EntityFrameworkCore.Extensions
publicclassUserImage:IFileEntity{publicGuidId{get;set;}publicGuidFileId{get;set;}publicstringName{get;set;}publicstringMimeType{get;set;}publicDateTimeOffsetTimeStamp{get;set;}publicGuid?NextId{get;set;}publicintChunkBytesLength{get;set;}publiclongTotalBytesLength{get;set;}publicbyte[]Data{get;set;}}publicclassUploadFileIdCommand{publicGuid?FileId{get;set;}}publicclassUploadCommand{publicIFormFileFile{get;set;}}publicclassWebApiContext:DbContext{publicWebApiContext(DbContextOptions<WebApiContext>options):base(options){}publicDbSet<UserImage>UserImage{get;set;}}[Route("api/user-images")][ApiController]publicclassUserImagesController:ControllerBase{privatereadonlyWebApiContext_context;publicUserImagesController(WebApiContextcontext){_context=context;}[HttpPost][DisableRequestSizeLimit]publicasyncTask<ActionResult<FilesExtensionsResponse>>UploadFile([FromForm]UploadCommanduploadCommand){varfile=uploadCommand.File;if(file.Length>0){varfileDetails=await_context.SaveFileAsync<UserImage>(file.OpenReadStream(),file.FileName,file.ContentType);returnOk(fileDetails);}else{returnBadRequest("File is required.");}}[HttpPost("other-file")]publicasyncTask<ActionResult<FilesExtensionsResponse>>UploadOtherFile([FromBody]UploadFileIdCommandcommand){//The @"appsettings.json" is a path to any file you will like to savevarfileDetails=await_context.SaveFileAsync<UserImage>(@"appsettings.json",command?.FileId);//Save will be auto called on every chunk addition so that memory usage remain low, i.e. await _context.SaveChangesAsync();returnOk(fileDetails);}[HttpGet("{id}/download")]publicasyncTask<IActionResult>DownLoadFile(Guidid){varfileDetails=await_context.GetFileInfoAsync<UserImage>(id);varstream=newMemoryStream();await_context.DownloadFileToStreamAsync<UserImage>(id,stream);returnFile(stream,fileDetails.MimeType,fileDetails.Name);}[HttpGet("{id}/view")]publicasyncTask<FileStreamResult>DownloadView(Guidid){varfileDetails=await_context.GetFileInfoAsync<UserImage>(id);varstream=newMemoryStream();await_context.DownloadFileToStreamAsync<UserImage>(id,stream);returnnewFileStreamResult(stream,fileDetails.MimeType);}[HttpDelete("{id}")]publicasyncTask<IActionResult>DeleteUserImage(Guidid){if(_context.UserImage==null){returnNotFound();}varuserImage=await_context.UserImage.FindAsync(id);if(userImage==null){returnNotFound();}await_context.DeleteFileAsync<UserImage>(id);//Save will be auto called on every chunk deletion so that memory usage remain low, i.e. await _context.SaveChangesAsync();returnNoContent();}}