What are the recommended security measures to implement when dealing with file uploads in PHP?

When dealing with file uploads in PHP, it is crucial to implement security measures to prevent malicious file uploads that can compromise the server. Some recommended security measures include validating file types, restricting file sizes, storing files in a secure location, and renaming files to prevent overwrite attacks.

// Validate file type
$allowed_file_types = array('jpg', 'jpeg', 'png', 'gif');
$file_extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);

if (!in_array($file_extension, $allowed_file_types)) {
    die('Invalid file type. Only JPG, JPEG, PNG, and GIF files are allowed.');
}

// Restrict file size
$max_file_size = 1048576; // 1MB
if ($_FILES['file']['size'] > $max_file_size) {
    die('File size exceeds the limit of 1MB.');
}

// Store file in a secure location
$upload_dir = 'uploads/';
$upload_file = $upload_dir . basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $upload_file);

// Rename file to prevent overwrite attacks
$new_file_name = uniqid() . '_' . $_FILES['file']['name'];
$upload_file = $upload_dir . $new_file_name;
move_uploaded_file($_FILES['file']['tmp_name'], $upload_file);