What are the best practices for handling file uploads in PHP, especially when it comes to security measures like file type validation?

When handling file uploads in PHP, it is crucial to validate the file type to prevent malicious files from being uploaded to the server. One way to do this is by checking the file extension against a list of allowed file types. Additionally, it is recommended to store uploaded files in a location outside the web root directory to prevent direct access.

<?php
// Define allowed file types
$allowed_types = array('jpg', 'jpeg', 'png', 'gif');

// Get the file extension
$file_extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

// Check if the file type is allowed
if (!in_array($file_extension, $allowed_types)) {
    die("Invalid file type. Only JPG, JPEG, PNG, and GIF files are allowed.");
}

// Move the uploaded file to a secure location
$upload_dir = 'uploads/';
$upload_file = $upload_dir . basename($_FILES['file']['name']);

if (move_uploaded_file($_FILES['file']['tmp_name'], $upload_file)) {
    echo "File uploaded successfully.";
} else {
    echo "Error uploading file.";
}
?>