I know (from the answer to this question: .rar, .zip files MIME Type) that that most people check zip files in PHP as application/zip
or application/octet-stream
, but I have a couple of questions about this:
- is it safe just to check for
application/octet-stream
(given thatapplication/octet-stream
can be used to describe many more file types than just zip!). I know I could check the file in other ways too, but thought I should try and keep everything as simple as possible - I've tried to check for as many different actual zip types as possible; but, there are some which give some unexpected results. I've found 1 for which the mime-type is
application/x-external-editor
, but PHP has problems dealing with it (although the only error I get isWarning: ZipArchive::close() [ziparchive.close]: Invalid or unitialized Zip object
) - is this documented anywhere? Is there a list of actualx-
mimetypes which PHP can cope with?
Edit
In answer to the questions below:
- I'm checking the mime type by using
$_FILES['fileatt']['type']
, but usingmime_content_type()
gives the same result. Different zip files seem to be any one of the following:'application/zip'
,'application/x-compressed'
,'application/x-zip-compressed'
,'application/x-compressed'
,'multipart/x-zip'
. I didn't understand why I got an error when the mime type was detected as beingapplication/x-external-editor
. - I have got the zip extension installed, and I am extracting all the files from the zip files when they are uploaded. I hadn't thought about checking the error.
I have also found another thing I don't quite understand: when I use the following code with a file which PHP reads as application/x-external-editor
:
if($zip->open($_FILES[fileatt]['tmp_name'])===TRUE)
{
echo "success";
} else {
echo "error";
}
prints "error", but checking the file type as
$res = $zip->open($_FILES[fileatt]['tmp_name']);
if($res)
{
echo "success";
} else {
echo "error";
}
prints "success"; in this code, I assume that the boolean is effectively using ==
, not ===
, but why should this make a difference?
The error:
$res = $zip->open($_FILES[fileatt]['tmp_name']);
if($res===TRUE)
{
echo "success";
} else {
echo $res;
}
prints 19
- which error (http://uk3.php.net/manual/en/ziparchive.open.php) does 19 refer to?!