Web20 University

How to Handle Big File Uploads in PHP

Last edited on
Get up to 65% Off Hosting with FREE SSL & FREE Domains!

* Web 2.0 University is supported by it's audience. If you purchase through links on our site, we may earn an affiliate commision.

Uploading files in PHP is pretty straightforward but large files can be a challenge due to server limitations and performance considerations.

If you’ve ever faced issues like “PHP large file upload not working,” this guide is for you.

We’ll explore the necessary configurations, practical examples, and best practices to handle big file uploads efficiently and securely.


Challenges of Big File Uploads in PHP

When uploading large files, several limitations can prevent a successful upload. Common issues include:

  • Server Configurations: PHP’s default settings often restrict large file uploads.
  • Timeouts: Long uploads can exceed PHP or server time limits.
  • Performance: Large file uploads can strain server memory and processing power.
  • Security Risks: Improper handling of large files may expose vulnerabilities.
  • User Considerations: How does the user know the file upload is still in progress?

Configuring PHP for Big File Uploads

1. Update php.ini Settings

PHP’s default configuration restricts upload size. Modify the following directives in your php.ini file:

upload_max_filesize = 100M
post_max_size = 120M
max_execution_time = 300
max_input_time = 300
memory_limit = 128M
  • upload_max_filesize: Sets the maximum size for uploaded files.
  • post_max_size: Determines the maximum size of the entire POST request.
  • max_execution_time: Extends the script execution time for long uploads.
  • memory_limit: Increases memory allocation to handle file uploads efficiently.

Restart your server after updating these settings for the changes to take effect.


2. Configure .htaccess for Apache Servers

If you don’t have access to php.ini, you can adjust limits in the .htaccess file:

php_value upload_max_filesize 100M
php_value post_max_size 120M
php_value max_execution_time 300
php_value max_input_time 300

For NGINX, update the client_max_body_size directive in the configuration file:

client_max_body_size 100M;

3. Adjust Server Timeouts

Large file uploads take longer, so you need to configure server timeouts:

  • PHP: Extend max_execution_time and max_input_time as shown above.
  • Web Server: For Apache, adjust Timeout in the server configuration file. For NGINX, update the proxy_read_timeout setting.

Practical Example: PHP Script for Big File Uploads

Here’s an example of handling large file uploads with progress feedback:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $uploadDir = 'uploads/';
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }

    $file = $_FILES['file'];
    $targetPath = $uploadDir . basename($file['name']);

    if (move_uploaded_file($file['tmp_name'], $targetPath)) {
        echo "File uploaded successfully to: $targetPath";
    } else {
        echo "Failed to upload file.";
    }
}
?>

HTML Form for File Upload

<!DOCTYPE html>
<html>
<head>
    <title>Big File Upload</title>
</head>
<body>
    <h2>Upload a Large File</h2>
    <form action="upload.php" method="POST" enctype="multipart/form-data">
        <input type="file" name="file" required>
        <button type="submit">Upload</button>
    </form>
</body>
</html>

You might also want to consider adding a file upload progress bar to let the user know what the progress of the upload is.


Security Considerations for Big File Uploads

  1. Validate File Types: Restrict uploads to safe file types (e.g., .jpg, .png, .pdf).
  2. Sanitize File Names: Prevent directory traversal attacks by sanitizing file names.
  3. Limit File Sizes: Use PHP and server settings to cap file sizes and prevent abuse.
  4. Use a Temporary Directory: Store files in a temporary directory outside the web root.

Troubleshooting: Why PHP Large File Uploads May Not Work

If your large file upload isn’t working, check the following:

  • File Size Exceeds Limits: Verify upload_max_filesize and post_max_size.
  • Insufficient Execution Time: Extend max_execution_time or max_input_time.
  • Insufficient Memory: Increase memory_limit.
  • Server-Level Restrictions: Check web server settings, such as client_max_body_size in NGINX or LimitRequestBody in Apache.

Conclusion

Handling big file uploads in PHP requires careful attention to configuration and security. By adjusting php.ini, .htaccess, or server settings, and implementing best practices, you can ensure smooth uploads for your users.


Additional Resources

Get up to 65% Off Hosting with FREE SSL & FREE Domains!