May 5, 2023 08:41 by
Peter
There are a few things that all web applications have in common. File Upload is one of the most common things that all web applications have. This is used to move data, upload large amounts of data, upload pictures, videos, etc.
I've mostly seen three ways to share a file while working on different web apps and products, especially in ASP.NET MVC. We will look at it in depth.
1. File Control with Html.BeginForm
When we submit the form, we can post our selected file to the server and read it. Below is the code to bind the File control
@Html.TextBoxFor(model =>
model.DocumentFile, new {
type = "file",
@id = "documentFile"
})
And the type of DocumentFile property is as below.
public HttpPostedFileBase DocumentFile { get; set; }
To save this file, we created one folder and added the path of the folder in the config. We are accessing the folder location as below
var path = ConfigurationManager.AppSettings["CustomerDocuments"].ToString();
Now we need to save the file in the folder and insert the path of the file in the database
if (objGroup.GSTDocumentFile != null)
{
using (Stream inputStream = objGroup.GSTDocumentFile.InputStream)
{
byte[] data;
using (MemoryStream ms = new MemoryStream())
{
inputStream.CopyTo(ms);
data = ms.ToArray();
}
System.IO.File.WriteAllBytes(Path.Combine(ClientFolder, objGroup.GSTDocumentFile.FileName), data);
}
objGroup.Document = objGroup.DocumentFile.FileName;
}
2. File upload using AJAX - Base64 as a parameter
When we select a file using file upload on the browser, we need to fire an event to capture the file like below
document.getElementById("uploadfile").addEventListener('change', handleFileSelect, false);
Using this event listener, we execute the function on selection of file and capture the file as below
function handleFileSelect(evt) {
const id = evt.currentTarget.id;
const f = evt.target.files[0];
const Name = evt.target.files[0].name;
const reader = new FileReader();
reader.onload = (function(theFile) {
return function(e) {
const binaryData = e.target.result;
const base64String = window.btoa(binaryData);
$("#uploadDocBase64").val(base64String);
$("#uploadFileName").val(Name);
};
})(f);
reader.readAsBinaryString(f);
}
Here we capture the file as well as the file name, and using AJAX, we can send this file to the server
try {
const response = await fetch('@Url.Action("FileUpload", "Upload")', {
method: 'POST',
body: JSON.stringify({ fileStr: $("#uploadDocBase64").val() }),
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
});
const result = await response.json();
alert('Success');
} catch (error) {
alert('Failure');
console.error(error);
}
System.IO.File.WriteAllBytes(path, Convert.FromBase64String(Convert.ToString(fileStr)));
3. File Upload using Fetch with FileData
There is an issue with option no 2. Big files are not getting uploaded as it is going in the parameter. To overcome this, we can add all the parameters and files in fileData and upload a file.
try {
const fileData = new FormData();
fileData.append("File", $("#uploadDocBase64").val());
const response = await fetch('@Url.Action("UpdateStatusAndDiscussion", "Discussion")', {
method: 'POST',
body: fileData,
});
if (response.ok) {
alert("Success");
} else {
alert("Failure");
}
} catch (error) {
console.error(error);
}
Now you can capture the file in the controller
byte[] imageBytes = Convert.FromBase64String(File);
MemoryStream ms = new MemoryStream(imageBytes, 0, imageBytes.Length);
ms.Write(imageBytes, 0, imageBytes.Length);
path = HttpContext.Current.Server.MapPath("~/FileUpload/" + _GroupName + "/" + DoneFileName);
FileStream fileNew = new FileStream(path, FileMode.Create, FileAccess.Write);
ms.WriteTo(fileNew);
fileNew.Close();
ms.Close();
These are the ways to upload files to the server using ASP.NET MVC.