What are some best practices for handling file uploads in PHP to avoid errors like "failed to open stream" or "unable to move"?

When handling file uploads in PHP, it is important to ensure that the destination directory exists and has the correct permissions set. Additionally, always check if the file was uploaded successfully before attempting to move it to the destination directory. Finally, sanitize the file name to prevent any potential security vulnerabilities.

// Check if file was uploaded successfully
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $uploadDir = 'uploads/';
    $uploadFile = $uploadDir . basename($_FILES['file']['name']);

    // Ensure destination directory exists and has correct permissions
    if (!file_exists($uploadDir)) {
        mkdir($uploadDir, 0777, true);
    }

    // Sanitize file name
    $uploadFile = $uploadDir . uniqid() . '_' . basename($_FILES['file']['name']);

    // Move uploaded file to destination directory
    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
        echo "File uploaded successfully.";
    } else {
        echo "Failed to move file.";
    }
} else {
    echo "Error uploading file.";
}