Rápidito:
 
Tu problema 
array_search te puede arrojar 2 valores, la posición del valor en el arreglo, o false (estricto), por lo que debes usar === o !==, en tu caso ese if(array_search) está mal, ya que pides que sea true, entonces si lo encuentra te entregara un entero, o ese false estricto, para tu caso tendría que ser así 
if(is_int(array_search) || array_search !== false) 
Creo que es más optimo usar el valor de la key 
type de 
$_FILES y ver. además usaría 
in_array que te entrega true/false y punto. por último usaría 
move_uploaded_file en ves de 
copy mi opinión:    
Código PHP:
Ver original$folder = "dir/"; //img folder, neccessary "/" at end
$prm = array("image/gif","image/jpeg","image/png"); //types permitted  
$img = $_FILES["imagen"]["name"];
$typ = $_FILES["imagen"]["type"];
$tmp = $_FILES["imagen"]["tmp_name"];
 
    }
}
  
Pero para ver donde está el problema dale 
var_dump a 
is_uploaded_file a 
array_search y 
copy para ver donde anda el problema. 
saludos.