diff --git a/README.md b/README.md
index e9f41144..f0ec1a4e 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@ There are a significant number of controls in ASP.NET Web Forms, and we will foc
- [CheckBox](docs/EditorControls/CheckBox.md)
- [CheckBoxList](docs/EditorControls/CheckBoxList.md)
- [DropDownList](docs/EditorControls/DropDownList.md)
- - FileUpload
+ - [FileUpload](docs/EditorControls/FileUpload.md)
- [HiddenField](docs/EditorControls/HiddenField.md)
- [Image](docs/EditorControls/Image.md)
- [ImageButton](docs/EditorControls/ImageButton.md)
diff --git a/docs/EditorControls/FileUpload.md b/docs/EditorControls/FileUpload.md
new file mode 100644
index 00000000..d87d0ba1
--- /dev/null
+++ b/docs/EditorControls/FileUpload.md
@@ -0,0 +1,195 @@
+# FileUpload
+
+The **FileUpload** component allows users to select files from their local file system for upload to the server. It emulates the ASP.NET Web Forms FileUpload control with similar properties and behavior.
+
+Original Microsoft documentation: https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.webcontrols.fileupload?view=netframework-4.8
+
+## Features Supported in Blazor
+
+- `HasFile` - indicates whether a file has been selected
+- `FileName` - gets the name of the selected file
+- `FileBytes` - gets the file contents as a byte array
+- `FileContent` - gets a Stream to read the file data
+- `PostedFile` - gets a wrapper object compatible with HttpPostedFile
+- `AllowMultiple` - allows selection of multiple files
+- `Accept` - specifies file type restrictions (e.g., "image/*", ".pdf,.doc")
+- `MaxFileSize` - sets maximum allowed file size in bytes (default: 500KB)
+- `SaveAs(path)` - saves the uploaded file to a specified server path
+- `GetMultipleFiles()` - retrieves all selected files when AllowMultiple is true
+- `SaveAllFiles(directory)` - saves all selected files to a directory
+- `Enabled` - enables or disables the control
+- `Visible` - controls visibility
+- `ToolTip` - tooltip text on hover
+- All style properties (`BackColor`, `ForeColor`, `BorderColor`, `BorderStyle`, `BorderWidth`, `CssClass`, `Width`, `Height`, `Font`)
+
+### Blazor Notes
+
+- The control renders as a standard HTML `` element
+- File processing must be handled through component properties or methods
+- The `OnFileSelected` event fires when files are selected
+- Maximum file size should be configured based on your server's capabilities
+- For Blazor WebAssembly, file data is read in the browser before being sent to the server
+
+## Web Forms Features NOT Supported
+
+- Direct postback behavior - use event handlers instead
+- Automatic form submission - implement form handling in Blazor
+- Server-side file system access in WebAssembly - must send to API endpoint
+
+## Web Forms Declarative Syntax
+
+```html
+
+```
+
+## Blazor Syntax
+
+```razor
+
+
+
+
+@code {
+ FileUpload myFileUpload;
+
+ async Task HandleUpload()
+ {
+ if (myFileUpload.HasFile)
+ {
+ string fileName = myFileUpload.FileName;
+ await myFileUpload.SaveAs($"uploads/{fileName}");
+ }
+ }
+}
+```
+
+## Common Usage Patterns
+
+### Single File Upload
+
+```razor
+
+
+
+@code {
+ FileUpload fileControl;
+
+ async Task UploadPdf()
+ {
+ if (fileControl.HasFile)
+ {
+ await fileControl.SaveAs($"documents/{fileControl.FileName}");
+ }
+ }
+}
+```
+
+### Multiple File Upload
+
+```razor
+
+
+
+@code {
+ FileUpload fileControl;
+
+ async Task UploadAll()
+ {
+ if (fileControl.HasFile)
+ {
+ var savedPaths = await fileControl.SaveAllFiles("uploads");
+ // Process savedPaths list
+ }
+ }
+}
+```
+
+### Image Upload with Preview
+
+```razor
+
+
+@code {
+ FileUpload imageUpload;
+
+ void HandleImageSelected()
+ {
+ if (imageUpload.HasFile)
+ {
+ byte[] imageData = imageUpload.FileBytes;
+ // Process image data
+ }
+ }
+}
+```
+
+## Security Considerations
+
+- Always validate file types on the server side, not just through the `Accept` attribute
+- Set appropriate `MaxFileSize` limits to prevent denial-of-service attacks
+- Sanitize file names before saving to prevent directory traversal attacks
+- Scan uploaded files for malware before processing
+- Store uploaded files outside of the web root when possible
+- Implement authentication and authorization for file upload endpoints
+
+## Migration from Web Forms
+
+When migrating from Web Forms FileUpload:
+
+1. Replace `` with `` (remove `asp:` prefix and `runat="server"`)
+2. Replace `FileUpload1.HasFile` with direct property access (no change needed)
+3. Replace `FileUpload1.SaveAs(Server.MapPath("~/path"))` with `await FileUpload1.SaveAs(path)`
+4. Handle file uploads asynchronously using `async/await` pattern
+5. Use `@ref` instead of `ID` to reference the component in code
+
+### Before (Web Forms)
+
+```aspx
+
+
+
+// Code-behind
+protected void UploadButton_Click(object sender, EventArgs e)
+{
+ if (FileUpload1.HasFile)
+ {
+ FileUpload1.SaveAs(Server.MapPath("~/uploads/" + FileUpload1.FileName));
+ }
+}
+```
+
+### After (Blazor)
+
+```razor
+
+
+
+@code {
+ FileUpload FileUpload1;
+
+ async Task UploadButton_Click()
+ {
+ if (FileUpload1.HasFile)
+ {
+ await FileUpload1.SaveAs($"uploads/{FileUpload1.FileName}");
+ }
+ }
+}
+```
diff --git a/mkdocs.yml b/mkdocs.yml
index fb0ac6c9..b9418be6 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -69,6 +69,7 @@ nav:
- CheckBox: EditorControls/CheckBox.md
- CheckBoxList: EditorControls/CheckBoxList.md
- DropDownList: EditorControls/DropDownList.md
+ - FileUpload: EditorControls/FileUpload.md
- HiddenField: EditorControls/HiddenField.md
- Image: EditorControls/Image.md
- ImageButton: EditorControls/ImageButton.md
diff --git a/samples/AfterBlazorServerSide/Pages/ControlSamples/FileUpload/Default.razor b/samples/AfterBlazorServerSide/Pages/ControlSamples/FileUpload/Default.razor
new file mode 100644
index 00000000..d515e31d
--- /dev/null
+++ b/samples/AfterBlazorServerSide/Pages/ControlSamples/FileUpload/Default.razor
@@ -0,0 +1,47 @@
+@page "/ControlSamples/FileUpload"
+@using BlazorWebFormsComponents
+
+