I am trying to use an array of mime types to check when uploading files. The class I am using woks perfectly apart from checking against more than one mime type. The page calling the class is as follows
PHP Code:
$fu = new FileUpload();
$fu->max_filesize(5242880);
$fu->max_image_size(1500, 3000); // ($width, $height)
$vtypes = "image/pjpeg";
$fu->upload("imagefile", $vtypes, ".jpg");
$fu->save_file("uploads/");
if ($fu->error) {
echo $fu->error . "<br>";
} else {
// Successful upload!
print($fu->file['name'] . " was successfully uploaded!<br><br>\n");
// If it's an image, let's display the file
if(stristr($fu->file['type'], "image")) {
echo "<img src=\"uploads/" . $fu->file['name'] . "\" border=\"0\" alt=\"\"><br><br>\n";
}
}
The $vtypes line is where I am adding the valid mime types. If I change it to
PHP Code:
$vtypes = array('image/pjpeg' , 'image/gif' );
or any other combination I get an error saying Only Array files may be uploaded. The actual upload class is this, I did not write all of this, most is from various other scripts from the net.
PHP Code:
<?php
class FileUpload {
var $path;
var $acceptable_file_types;
var $error;
var $max_filesize;
var $max_image_width;
var $max_image_height;
//Class constructor method
function FileUpload() {
$this->error = '';
}
//Sets the maximum file size in bytes
function max_filesize($size) {
$this->max_filesize = (int) ($size);
}
//Sets the maximum image size. Only used if upload is an image file
function max_image_size($width, $height) {
$this->max_image_width = (int) ($width);
$this->max_image_height = (int) ($height);
}
//Checks if file is allowed and uploads to PHP's default directory
function upload($filename='', $accept_type='', $extension='') {
$this->acceptable_file_types = trim($accept_type); // used by error messages
if (!isset($_FILES) || !is_array($_FILES[$filename]) || !$_FILES[$filename]['name']) {
$this->error = $this->get_error(0);
$this->accepted = FALSE;
return FALSE;
}
// Copy PHP's global $_FILES array to a local array
$this->file = $_FILES[$filename];
$this->file['file'] = $filename;
// Initialize empty array elements
if (!isset($this->file['extention'])) $this->file['extention'] = "";
if (!isset($this->file['type'])) $this->file['type'] = "";
if (!isset($this->file['size'])) $this->file['size'] = "";
if (!isset($this->file['width'])) $this->file['width'] = "";
if (!isset($this->file['height'])) $this->file['height'] = "";
if (!isset($this->file['tmp_name'])) $this->file['tmp_name'] = "";
if (!isset($this->file['raw_name'])) $this->file['raw_name'] = "";
// test max size
if($this->max_filesize && ($this->file["size"] > $this->max_filesize)) {
$this->error = $this->get_error(1);
$this->accepted = FALSE;
return FALSE;
}
if(stristr($this->file["type"], "image")) {
//Checks if file is allowed and uploads to PHP's default directory
function upload($filename='', $accept_type='', $extension='') {
/*Error starts here, you assign $accept_type into array which is disallowed*/
$this->acceptable_file_types = trim($accept_type);
...
// check to see if the file is of type specified
/*This section is executed since $this->acceptable_file_types is not NULL*/
if($this->acceptable_file_types) {
/*Condition below is false, since php function stristr cannot evaluate arrays*/
if(trim($this->file["type"]) && (stristr($this->acceptable_file_types, $this->file["type"]) || stristr($this->file["type"], $this->acceptable_file_types)) ) {
$this->accepted = TRUE;
} else {
$this->accepted = FALSE;
/*Below is code which generates error to your browser*/
$this->error = $this->get_error(3);
}
} else {
$this->accepted = TRUE;
}
return (bool) $this->accepted;
}
...
//Gets the error message if any
function get_error($error_code='') {
$error_message = array();
$error_code = (int) $error_code;
$error_message[0] = "No file was uploaded";
$error_message[1] = "Maximum file size exceeded. File may be no larger than " . $this->max_filesize/1000 . " KB (" . $this->max_filesize . " bytes).";
$error_message[2] = "Maximum image size exceeded. Image may be no more than " . $this->max_image_width . " x " . $this->max_image_height . " pixels.";
/*Note that str_replace does nothing, because it try to replace something from array and not from string*/
$error_message[3] = "Only " . str_replace("|", " or ", $this->acceptable_file_types) . " files may be uploaded.";
$error_message[4] = "File '" . $this->path . $this->file["name"] . "' already exists.";
$error_message[5] = "Permission denied. Unable to copy file to '" . $this->path . "'";
return $error_message[$error_code];
}
}
How to cast away the error:
1. You don't need to change the class.
2. Notice that the class only holds single file upload. Therefore if you have multiple files to be uploaded you have to executed function FileUpload::upload several times as many as your files.
3. Notice that you can only pass string into $vtypes, not array since there is only single file upload. $vtypes could be: image/jpeg, image/gif, image/png or whatever that is prefixed with 'image/'