using FamilyTreeAPI.Entities; using FamilyTreeAPI.Repository; namespace FamilyTreeAPI.Controllers; using Microsoft.AspNetCore.Mvc; using System.IO; using System.Threading.Tasks; [ApiController] [Route("api/[controller]")] public class FileUploadController : ControllerBase { private readonly IWebHostEnvironment _hostingEnvironment; private readonly ImportPersonRepository _importPersonRepository; private readonly IConfiguration _config; public FileUploadController(IWebHostEnvironment hostingEnvironment, ImportPersonRepository importPersonRepository, IConfiguration config) { _hostingEnvironment = hostingEnvironment; _importPersonRepository = importPersonRepository; _config = config; } [HttpPost("[action]")] public async Task UploadFile(IFormFile file) { List> output = new (); if (file == null || file.Length == 0) { return BadRequest("No file uploaded."); } try { // Define the upload directory // var uploadsFolder = Path.Combine(_hostingEnvironment.WebRootPath, "uploads"); string importFolder = _config.GetValue("AppSettings:ImportFolder"); var uploadsFolder = Path.Combine(_hostingEnvironment.ContentRootPath, importFolder); if (!Directory.Exists(uploadsFolder)) { Directory.CreateDirectory(uploadsFolder); } // Create a unique file name to avoid overwriting var uniqueFileName = Path.GetFileNameWithoutExtension(file.FileName) + "_" + System.Guid.NewGuid().ToString() + Path.GetExtension(file.FileName); var filePath = Path.Combine(uploadsFolder, uniqueFileName); // Save the file to the server using (var stream = new FileStream(filePath, FileMode.Create)) { // await file.CopyToAsync(stream); await file.CopyToAsync(stream); // output = await _importPersonRepository.ImportPerson(stream, "Sheet1"); } using (var stream = new MemoryStream()) { await file.CopyToAsync(stream); output = await _importPersonRepository.ImportPerson(stream, "Sheet1"); } //return Ok(new { FileName = uniqueFileName, FilePath = filePath }); return Ok(output); } catch (System.Exception ex) { return StatusCode(500, $"Internal server error: {ex.Message}"); } } [HttpPost("[action]")] public async Task DownloadFile(DownloadFileCriteria criteria) { var rev = await _importPersonRepository.DownloadFile(criteria); return Ok(rev); } }