PHP: How to get file name/extensions from a path

Updated: January 11, 2024 By: Guest Contributor Post a comment

Overview

Working with files is a common task in web development, and PHP, being a server-side scripting language, provides a powerful suite of functions for file manipulation. One operation that is frequently needed is the extraction of a file name or file extension from a given file path. This can be essential for various tasks like file validation, handling uploads, or managing file storage. In this tutorial, we will delve into how to retrieve a file name and its extension from a file path using PHP.

Understanding File Paths

Before we begin, let’s clarify what a file path in PHP might look like. A file path can either be an absolute path which specifies exact file location on the filesystem, starting from the root directory, or a relative path which specifies the file location in relation to the directory where the PHP script is running. For example:

/var/www/html/images/photo.jpg        
./images/photo.jpg                      

A file path consists of directory names, possibly a filename, and an extension that indicates the file type. The extension is the substring which follows the last dot ‘.’ character of the file name.

Extracting a File Name in PHP

PHP’s pathinfo() function is incredibly handy for file path operations. To get detailed information about a file name and path data, pathinfo() can be used, which returns an associative array containing elements like ‘dirname’, ‘basename’, ‘extension’, and ‘filename’.

$filePath = '/var/www/html/images/photo.jpg';
$pathParts = pathinfo($filePath);

print_r($pathParts);

You will get an output similar to:

Array
(
    [dirname] => /var/www/html/images
    [basename] => photo.jpg
    [extension] => jpg
    [filename] => photo
)

Here, ‘basename’ is the filename with the extension, ‘filename’ is just the name of the file without the extension, and ‘extension’ is the file extension itself.

Extracting File Name Without Extension

We can extract the filename without its extension simply by accessing the ‘filename’ key of the array returned by pathinfo():

$fileName = $pathParts['filename'];
echo $fileName;  // Outputs: photo

Extracting a File Extension in PHP

If you’re only interested in getting the file extension, you can specify the PATHINFO_EXTENSION flag as a second argument to the pathinfo() function:

$fileExtension = pathinfo($filePath, PATHINFO_EXTENSION);
echo $fileExtension;  // Outputs: jpg

Alternative Way Using basename()

Sometimes you may need only the file name with its extension. PHP’s basename() function is perfect for this scenario. Here’s how you can use it:

$baseName = basename($filePath);
echo $baseName;  // Outputs: photo.jpg

Stripping Extension from a Basename

If you have used basename() to get the file’s basename and you wish to separate the file name from its extension manually, you can use explode() or string manipulation functions like strrpos() and substr().

// Using explode()
list($fileName) = explode('.', $baseName);
echo $fileName;  // Outputs: photo

// Using strrpos() and substr()
$dotPosition = strrpos($baseName, '.');
if ($dotPosition !== false) {
    $fileName = substr($baseName, 0, $dotPosition);
    echo $fileName;  // Outputs: photo
}

Security Considerations

When dealing with file names and extensions, security is paramount. Never trust the file name supplied by a user’s file upload. Always validate and sanitize the input and consider using a server-generated name. A common technique is to validate the file extension against a whitelist of allowed extensions and reject any file that does not match the criteria.

Here’s an example of how you might implement these security considerations in PHP:

  1. Validate File Extension: Check if the file extension is in a list of allowed extensions.
  2. Sanitize File Name: Remove any potentially harmful characters from the file name.
  3. Generate a Server-Side Name: Optionally, generate a unique name for the file on the server to avoid any conflicts and further enhance security.

Here’s a sample PHP code snippet implementing these practices:

<?php
// List of allowed file extensions
$allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'pdf'];

// Assuming you have a file input in your form with the name 'userfile'
if (isset($_FILES['userfile'])) {
    $errors = [];

    // Extract file extension
    $fileExtension = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));

    // Check if the file extension is allowed
    if (!in_array($fileExtension, $allowedExtensions)) {
        $errors[] = "File extension not allowed.";
    }

    // Sanitize file name
    $safeFileName = preg_replace('/[^a-zA-Z0-9-_\.]/', '', $_FILES['userfile']['name']);

    // Optionally, generate a server-side name
    $serverFileName = uniqid() . '.' . $fileExtension;

    // Check for errors
    if (count($errors) === 0) {
        // Move the uploaded file to a safe location
        if (move_uploaded_file($_FILES['userfile']['tmp_name'], 'uploads/' . $serverFileName)) {
            echo "File uploaded successfully.";
        } else {
            echo "File upload failed.";
        }
    } else {
        // Output errors
        foreach ($errors as $error) {
            echo $error . "\n";
        }
    }
}
?>

This script does the following:

  • Checks if a file has been uploaded.
  • Validates the file extension against the $allowedExtensions array.
  • Sanitizes the original file name to remove any unwanted characters.
  • Generates a unique file name for storing the file on the server.
  • Moves the uploaded file to a directory named uploads (make sure this directory exists and has the correct permissions).

Remember to adjust the script according to your specific requirements and server configuration. Also, ensure that the uploads directory is properly secured and not directly accessible via the web.

Conclusion

Through this guide, we’ve explored how to use PHP’s built-in functions to extract file names and extensions from file paths. By using pathinfo(), basename(), and string manipulation functions, we can handle various file operations with ease. Always keep in mind the security implications of file handling and ensure that you validate and sanitize all user input to maintain a secure environment.

Getting file names and extensions are just the tip of the iceberg, there’s a whole range of file functions provided by PHP that can help you manage your files efficiently. Continue exploring PHP documentation and other resources to deepen your understanding of file handling in PHP.