How to add a file uploads function to a webpage in HTML?

File uploads are essential for modern web applications, allowing users to share documents, images, and other files. In HTML, file uploads are implemented using the <input type="file"> element combined with form handling. This functionality requires both client-side HTML forms and server-side processing to securely store uploaded files.

Syntax

Following is the basic syntax for creating a file upload form in HTML

<form action="upload_handler.php" method="post" enctype="multipart/form-data">
   <input type="file" name="uploadedFile">
   <input type="submit" value="Upload">
</form>

The key attributes are

  • method="post" File uploads require POST method

  • enctype="multipart/form-data" Essential encoding type for file uploads

  • action Server-side script to handle the uploaded file

Using Basic HTML Form with File Input

This approach uses a standard HTML form to upload files. The form submits to a server-side script that processes and saves the uploaded file. This method causes a full page refresh upon submission.

Example

Following example demonstrates a basic file upload form

<!DOCTYPE html>
<html>
<head>
   <title>Basic File Upload</title>
</head>
<body style="font-family: Arial, sans-serif; padding: 20px;">
   <h2>Upload Your File</h2>
   <form action="upload.php" method="post" enctype="multipart/form-data">
      <div style="margin: 10px 0;">
         <label for="fileInput">Select file:</label>
         <input type="file" id="fileInput" name="uploadedFile" accept=".jpg,.jpeg,.png,.pdf">
      </div>
      <div style="margin: 10px 0;">
         <input type="submit" value="Upload File" style="padding: 8px 16px; background: #007bff; color: white; border: none; border-radius: 4px;">
      </div>
   </form>
</body>
</html>

This creates a file upload form with file type restrictions. The accept attribute limits file selection to specific types, though server-side validation is still required for security.

Server-Side PHP Handler

Following PHP script handles the file upload process

<?php
if(isset($_FILES['uploadedFile'])) {
    $errors = array();
    $file_name = $_FILES['uploadedFile']['name'];
    $file_size = $_FILES['uploadedFile']['size'];
    $file_tmp = $_FILES['uploadedFile']['tmp_name'];
    $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
    
    $allowed_extensions = array("jpeg", "jpg", "png", "pdf");
    $max_file_size = 2097152; // 2 MB
    
    // Validate file extension
    if(!in_array($file_ext, $allowed_extensions)) {
        $errors[] = "Extension not allowed. Please choose a JPEG, PNG, or PDF file.";
    }
    
    // Validate file size
    if($file_size > $max_file_size) {
        $errors[] = "File size must be less than 2 MB.";
    }
    
    // Check for upload errors
    if($_FILES['uploadedFile']['error'] !== 0) {
        $errors[] = "Upload error occurred.";
    }
    
    if(empty($errors)) {
        $upload_dir = "uploads/";
        $safe_filename = uniqid() . "." . $file_ext;
        
        if(move_uploaded_file($file_tmp, $upload_dir . $safe_filename)) {
            echo "File uploaded successfully!";
        } else {
            echo "Failed to move uploaded file.";
        }
    } else {
        foreach($errors as $error) {
            echo $error . "<br>";
        }
    }
}
?>

Using jQuery and AJAX

This approach provides a better user experience by uploading files without page refresh. It uses AJAX to submit the form asynchronously and provides real-time feedback to users.

Example

Following example shows an AJAX-based file upload implementation

<!DOCTYPE html>
<html>
<head>
   <title>AJAX File Upload</title>
   <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body style="font-family: Arial, sans-serif; padding: 20px;">
   <h2>Upload File with AJAX</h2>
   <form id="uploadForm" enctype="multipart/form-data">
      <div style="margin: 10px 0;">
         <label for="fileInput">Select file:</label>
         <input type="file" id="fileInput" name="uploadedFile" accept=".jpg,.jpeg,.png,.pdf">
      </div>
      <div style="margin: 10px 0;">
         <button type="submit" style="padding: 8px 16px; background: #28a745; color: white; border: none; border-radius: 4px;">Upload File</button>
      </div>
   </form>
   <div id="uploadResult" style="margin-top: 20px; padding: 10px; border-radius: 4px; display: none;"></div>
   <div id="progressBar" style="width: 100%; background: #f0f0f0; border-radius: 4px; margin-top: 10px; display: none;">
      <div id="progressFill" style="width: 0%; height: 20px; background: #007bff; border-radius: 4px; transition: width 0.3s;"></div>
   </div>

   <script>
   $(document).ready(function() {
      $('#uploadForm').on('submit', function(e) {
         e.preventDefault();
         
         var fileInput = $('#fileInput')[0];
         var file = fileInput.files[0];
         
         if (!file) {
            showResult('Please select a file to upload.', 'error');
            return;
         }
         
         // Client-side validation
         var maxSize = 2097152; // 2MB
         var allowedTypes = ['image/jpeg', 'image/jpg', 'image/png', 'application/pdf'];
         
         if (file.size > maxSize) {
            showResult('File size must be less than 2 MB.', 'error');
            return;
         }
         
         if (allowedTypes.indexOf(file.type) === -1) {
            showResult('Please select a JPEG, PNG, or PDF file.', 'error');
            return;
         }
         
         // Create FormData object
         var formData = new FormData();
         formData.append('uploadedFile', file);
         
         // Show progress bar
         $('#progressBar').show();
         
         // AJAX upload
         $.ajax({
            url: 'upload.php',
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            xhr: function() {
               var xhr = new window.XMLHttpRequest();
               xhr.upload.addEventListener("progress", function(evt) {
                  if (evt.lengthComputable) {
                     var percentComplete = evt.loaded / evt.total;
                     $('#progressFill').css('width', (percentComplete * 100) + '%');
                  }
               }, false);
               return xhr;
            },
            success: function(response) {
               $('#progressBar').hide();
               showResult('File uploaded successfully!', 'success');
               $('#uploadForm')[0].reset();
            },
            error: function() {
               $('#progressBar').hide();
               showResult('Upload failed. Please try again.', 'error');
            }
         });
      });
      
      function showResult(message, type) {
         var resultDiv = $('#uploadResult');
         resultDiv.text(message);
         resultDiv.css('background-color', type === 'success' ? '#d4edda' : '#f8d7da');
         resultDiv.css('color', type === 'success' ? '#155724' : '#721c24');
         resultDiv.css('border', '1px solid ' + (type === 'success' ? '#c3e6cb' : '#f5c6cb'));
         resultDiv.show();
         
         setTimeout(function() {
            resultDiv.fadeOut();
         }, 3000);
      }
   });
   </script>
</body>
</html>

This implementation includes client-side validation, upload progress tracking, and user-friendly feedback messages. The form submits asynchronously without refreshing the page.

File Upload Process Flow User Selects File Client Validation Form Submission Server Processing File Storage Response to User Basic Flow: HTML Form ? Server AJAX Flow: Asynchronous Processing

File Upload Attributes and Options

Following are important attributes and options for file input elements

Attribute Purpose Example
accept Restrict file types in file picker accept=".jpg,.png,.pdf"
multiple Allow multiple file selection <input type="file" multiple>
capture Use device camera (mobile) capture="environment"
required Make file selection mandatory <input type="file" required>

Security Considerations

File uploads present security risks that must be addressed

  • File type validation Validate file extensions and MIME types on both client and server

  • File size limits Restrict maximum file size to prevent server overload

  • Filename sanitization

Updated on: 2026-03-16T21:38:54+05:30

4K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements