Search code examples
phppdfunzipphp-ziparchive

ZipArchive:: check file extension


The following code unzips my uploaded file and extracts everything in a directory called PDF. It then proceeds to iterate through the files and return files to download.

My problem is I need to check the file extension. I would only like to return the PDF file back to the user but some of the uploaded files have unnecessary images.

How can I check the contents of the file to ensure the unzipped file is a PDF & only the PDF is returned back to the user?

<?php
$zip = new ZipArchive;
$res = $zip->open('/download/xxxx.zip');
if ($res === TRUE) {
  $zip->extractTo('/download/pdf/');

    for($i = 0; $i < $zip->numFiles; $i++) 
    {   
        echo '<a href="/download/pdf/' . $zip->getNameIndex($i) . '">download</a>'; 
    } 

$zip->close();

} else {
  echo 'Something went wrong :( ';
}
?>

Thank you


Dexas solution worked for me. Here's the code if you need it I've added in comments to show what I've changed.

<?php

$zip = new ZipArchive;
$res = $zip->open('/download/xxxxx.zip');
if ($res === TRUE) {
  $zip->extractTo('/download/pdf/');

    for($i = 0; $i < $zip->numFiles; $i++) 
    {   
        //Load files into variable which can be used with the following... ['dirname'], ['basename'], ['extension'], ['filename']
        $path_parts = pathinfo('/download/pdf/' . $zip->getNameIndex($i));

        //If the extension is equal to PDF echo the code out
        if($path_parts['extension'] === 'pdf')
        {
            echo '<a href="/download/pdf/' . $zip->getNameIndex($i) . '">download</a>'; 
        }
    } 

$zip->close();

} else {
  echo 'Something went wrong :( ';
}

?>

Solution

  • You can check it's MIME type using finfo

    $finfo = new finfo(FILEINFO_MIME);    
    $type = $finfo->file('/path/to/file');
    
    if($type === 'application/pdf')
    {
        //do your stuff
    }
    

    For the extension part you can use pathinfo

    $ext = pathinfo('/path/to/file', PATHINFO_EXTENSION);
    

    In the end you should check both and decide is it PDF or not.