Accessing Filesystem in PHP

1. Introduction

File handling is a crucial aspect of any programming language, and PHP is no exception. Being a server-side scripting language, PHP provides a robust set of functions to handle file operations. This blog will guide you through the various file handling functions in PHP, from basic operations like reading and writing files to more advanced tasks like handling file uploads and managing directories.

2. Basic File Handling Operations

Opening a File

Opening a file in PHP is accomplished using the fopen function. This function requires two parameters: the file path and the mode in which you want to open the file.

<?php
$file = fopen("example.txt", "r"); // Open the file in read mode
?>

Here are some common modes:

  • r: Read-only mode. Starts at the beginning of the file.

  • w: Write-only mode. Opens and truncates the file to zero length or creates a new file if it does not exist.

  • a: Append mode. Opens and writes to the end of the file or creates a new file if it does not exist.

Reading a File

To read the contents of a file, you can use the fread or fgets functions. fread reads a specified number of bytes, while fgets reads a line.

<?php
$file = fopen("example.txt", "r");
$content = fread($file, filesize("example.txt")); // Read the entire file
echo $content;
fclose($file);
?>

Writing to a File

Writing to a file can be done using the fwrite function. This function writes the specified string to the file.

<?php
$file = fopen("example.txt", "w");
fwrite($file, "Hello, world!");
fclose($file);
?>

Closing a File

It's important to close a file after you're done with it to free up system resources. This is done using the fclose function.

<?php
$file = fopen("example.txt", "r");
// ... perform file operations ...
fclose($file);
?>

3. Advanced File Handling Operations

Appending to a File

To append content to an existing file, use the a mode with the fopen function.

<?php
$file = fopen("example.txt", "a");
fwrite($file, "Appended text.");
fclose($file);
?>

Deleting a File

To delete a file, use the unlink function.

<?php
if (file_exists("example.txt")) {
    unlink("example.txt");
    echo "File deleted.";
} else {
    echo "File does not exist.";
}
?>

Checking if a File Exists

Use the file_exists function to check if a file exists.

<?php
if (file_exists("example.txt")) {
    echo "File exists.";
} else {
    echo "File does not exist.";
}
?>

File Permissions

To change file permissions, use the chmod function.

<?php
chmod("example.txt", 0644); // Change file permissions
?>

4. Working with Directories

Creating a Directory

To create a directory, use the mkdir function.

<?php
if (!file_exists("new_directory")) {
    mkdir("new_directory", 0755, true);
    echo "Directory created.";
} else {
    echo "Directory already exists.";
}
?>

Reading a Directory

To read the contents of a directory, use the scandir function.

<?php
$dir = "path/to/directory";
$files = scandir($dir);

foreach ($files as $file) {
    echo $file . "\n";
}
?>

Deleting a Directory

To delete an empty directory, use the rmdir function.

<?php
if (is_dir("empty_directory")) {
    rmdir("empty_directory");
    echo "Directory deleted.";
} else {
    echo "Directory does not exist or is not empty.";
}
?>

5. Handling File Uploads

Handling file uploads in PHP involves a few steps. Here's a simple example:

  1. Create an HTML form:
<!DOCTYPE html>
<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
  Select file to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload File" name="submit">
</form>

</body>
</html>
  1. Handle the file upload in upload.php:
<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}

// Allow certain file formats
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") {
    echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
    $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

6. File and Directory Iterators

PHP provides the DirectoryIterator and FilesystemIterator classes for more advanced directory operations.

DirectoryIterator Example

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        echo $fileinfo->getFilename() . "\n";
    }
}
?>

FilesystemIterator Example

<?php
$dir = new FilesystemIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if ($fileinfo->isFile()) {
        echo $fileinfo->getFilename() . "\n";
    }
}
?>

7. Sample PHP Scripts (Projects)

Simple File Uploader

Let's create a simple file uploader that allows users to upload files to a server and list them.

  1. HTML Form:
<!DOCTYPE html>
<html>
<body>

<h2>File Upload</h2>
<form action="file_upload.php" method="post" enctype="multipart/form-data">
  Select file to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload File" name="submit">
</form>

<h2>Uploaded Files</h2>
<ul>
<?php
$dir = "uploads/";
$files = scandir($dir);

foreach ($files as $file) {
    if ($file != "." && $file != "..") {
        echo "<li><a href='$dir$file'>$file</a></li>";
    }
}
?>
</ul>

</body>
</html>
  1. PHP File Upload Handler (file_upload.php):
<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));

// Check if file already exists
if (file_exists($target_file)) {
    echo "Sorry, file already exists.";
    $uploadOk = 0;
}

// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
    echo "Sorry, your file is too large.";
    $uploadOk = 0;
}

// Allow certain file formats
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" && $imageFileType != "pdf") {
    echo "Sorry, only JPG, JPEG, PNG, GIF & PDF files are allowed.";
    $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "Sorry, your file was not uploaded.";
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "The file " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.";
    } else {
        echo "Sorry, there was an error uploading your file.";
    }
}
?>

Directory Explorer

A directory explorer allows users to navigate through directories and view the contents.

  1. Directory Explorer (index.php):
<!DOCTYPE html>
<html>
<body>

<h2>Directory Explorer</h2>
<ul>
<?php
$dir = isset($_GET['dir']) ? $_GET['dir'] : '.';
$files = scandir($dir);

foreach ($files as $file) {
    if ($file != "." && $file != "..") {
        if (is_dir("$dir/$file")) {
            echo "<li><a href='?dir=$dir/$file'>$file/</a></li>";
        } else {
            echo "<li>$file</li>";
        }
    }
}
?>
</ul>

</body>
</html>

Log Management System

A simple log management system can help in tracking user activities or system events.

  1. Log Writer (log.php):
<?php
function writeLog($message) {
    $file = fopen("log.txt", "a");
    fwrite($file, date('Y-m-d H:i:s') . " - " . $message . "\n");
    fclose($file);
}

// Example usage
writeLog("User logged in.");
writeLog("User performed an action.");
?>
  1. Log Reader (read_log.php):
<!DOCTYPE html>
<html>
<body>

<h2>Log Viewer</h2>
<pre>
<?php
if (file_exists("log.txt")) {
    echo htmlspecialchars(file_get_contents("log.txt"));
} else {
    echo "No logs found.";
}
?>
</pre>

</body>
</html>

8. Conclusion

File handling in PHP is an essential skill for any web developer. It allows you to manage files and directories on the server, handle file uploads, and create robust file management systems. This comprehensive guide covered the basics and advanced operations, providing you with the knowledge and tools to effectively work with the filesystem in PHP.

By practicing the examples and mini-projects provided, you'll gain a deeper understanding of file handling in PHP and be well-equipped to handle various file-related tasks in your web applications. Happy coding!