I have a controller, which I will include the methods for at the end. I allow users to upload either .DOC, .DOCX or .PDF files via my POST method.
I then have a GET method which I can currently return a file from, but it is hardcoded to .PDF. I want to know how I would enable my GET method read from any of the file types above? Or how would I get the file extension of a file, before I have read it into a stream?
If you have any feedback on my approach to either method, feedback is welcome!
[HttpGet("Download/{requestId}/{lineNumber}")]
public IActionResult Download([FromRoute] long requestId, [FromRoute] int lineNumber)
{
string fileName = requestId.ToString() + lineNumber.ToString();
string fileDownloadName = fileName + DateTime.Now.ToString("ddMMyyyy");
try
{
FileStream stream = new(GetFilePath() + fileName + ".pdf", FileMode.Open);
return File(stream, "application/pdf", fileDownloadName + ".pdf");
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
}
[HttpPost("Upload/{requestId}/{lineNumber}")]
public async Task<IActionResult> OnPostUploadAsync(IFormFile formFile, [FromRoute] long requestId, [FromRoute] int lineNumber)
{
try
{
if (formFile.Length > 0)
{
string filename = formFile.FileName;
string filepath = GetFilePath();
string docId = requestId.ToString() + lineNumber.ToString();
var supportedTypes = new[] { "doc", "docx", "pdf" };
var fileExt = System.IO.Path.GetExtension(formFile.FileName).Substring(1);
string concessionDocumentPath = filepath + "\" + docId + "." + fileExt;
if (!supportedTypes.Contains(fileExt))
{
string ErrorMessage = "File Extension Is Invalid - Only Upload WORD/PDF File";
return BadRequest(ErrorMessage);
}
if (!System.IO.Directory.Exists(filepath))
{
System.IO.Directory.CreateDirectory(filepath);
}
if (System.IO.File.Exists(concessionDocumentPath))
{
System.IO.File.Delete(concessionDocumentPath);
}
using (FileStream stream = System.IO.File.Create(concessionDocumentPath))
{
await formFile.CopyToAsync(stream);
}
}
}
catch (Exception ex)
{
return BadRequest(ex.Message);
}
return Ok(formFile.FileName.ToString() + " was uploaded successfully");
}
[NonAction]
private string GetFilePath()
{
return this._environment.WebRootPath + "\Uploads\ConcessionDocuments\";
}
2
Answers
With thanks to @WisdomSeeker for his help, I was able to get a solution in place. Instead of using GetFiles, I used EnumerateFiles
I'm doubtful it's the most effective, or best way to do this, but it works for what I need.
One way I could think of for getting the file extension is
and you could use this extension in the hardcoded part.
Here I assumed you have only one file in the directory. Now if you have multiple files in the directory, try to identify the file using
searchPattern
overload ofGetFiles
.Hope this helps.