php - the_permalink - while twig
PHP-Looping a través de $_FILES para verificar el tipo de archivo (7)
Bueno, tu lógica booleana es ambigua y es probable que no hagas lo que quieres. Esto probablemente funcionará mejor:
if ((($_FILES["image$i"]["type"] == "image/gif")
|| ($_FILES["image$i"]["type"] == "image/jpeg")
|| ($_FILES["image$i"]["type"] == "image/png" ))
&& ($_FILES["image$i"]["size"] < 500000))
Aunque si tuviera mi druthers, todo se vería así:
$file = $_FILES[''image'' . $i];
$type = $file[''type''];
if(($type == ''image/gif'' || $type == ''image/jpeg'' || $type == ''image/png'') && $file[''size''] < 500000)
Mi primera pregunta en SO, gracias. :)
Estoy desarrollando un sistema de registro de problemas de soporte para mi empresa y debe permitir la carga de archivos y cualquier problema enviado a nuestra base de datos. Podría haber de 0 a 6 cargas diferentes para verificar, junto con un problema de soporte. Logré obtener una variable precisa de cuántos archivos hay al tener un campo de entrada oculto (imgcount) que se actualiza mediante js cada vez que se selecciona una imagen a través de una entrada type = "file", o se elimina del formulario.
Mis nombres [input type = "file"] son image1, image2, etc. Como pensé que sería más fácil de esta manera recorrerlos.
Cuando se envía el formulario, el siguiente código mira para ver si hay algún archivo y comprueba que son de tipo válido (gif / jpeg / png), por lo que se pueden cargar de forma segura. No estoy demasiado preocupado por los virus ya que el sistema de soporte tiene un buen inicio de sesión seguro y confiamos en nuestros clientes.
$sscount = $_POST[''imgcount''];
echo $sscount; //to test the variable
if($sscount>0){
for($i = 1; $i <= $sscount; $i++){
if (($_FILES["image$i"]["type"] == "image/gif")
|| ($_FILES["image$i"]["type"] == "image/jpeg")
|| ($_FILES["image$i"]["type"] == "image/png" )
&& ($_FILES["image$i"]["size"] < 500000))
{
}
else
{
$errormsg .= "Error: Image $i must be either JPEG, GIF, or PNG and less than 500 kb.<br />";
}
}
}
Pero parece que no se está ejecutando correctamente, ¿alguien tiene alguna idea de cómo hacer para que vuelva y vuelva correctamente?
Creo que tu if
condicional es incorrecto. Necesita paréntesis alrededor del primer grupo de booleanos que están OR, como este:
if ( (($_FILES["image$i"]["type"] == "image/gif")
|| ($_FILES["image$i"]["type"] == "image/jpeg")
|| ($_FILES["image$i"]["type"] == "image/png" ))
&& ($_FILES["image$i"]["size"] < 500000))
Esto significa correctamente "si el archivo es una imagen de (gif o jpeg o png) AND es menor que ese tamaño".
La forma en que la tenías antes no era la lógica que deseaste.
El operador && tiene una precedencia mayor que ||, por lo tanto, en lugar de (A OR B OR C) AND D
como lo concibió, en realidad es A OR B OR (C AND D)
Puede usar paréntesis para aplicar la evaluación que desea.
Sin embargo, algo como esto podría ser más limpio y fácil de mantener / leer:
$allowed_types=array(
''image/gif'',
''image/jpeg'',
''image/png'',
);
$sscount = $_POST[''imgcount''];
if($sscount>0){
for($i = 1; $i <= $sscount; $i++){
if (in_array($_FILES["image$i"]["type"], $allowed_types) &&
($_FILES["image$i"]["size"] < 500000))
{
}
}
}
Esta no es una respuesta directa a su pregunta, pero puede pasar los valores de formulario a PHP como una matriz que debería ser más fácil de recorrer. in_array()
también es útil para verificar que un valor esté dentro de una lista permitida.
HTML:
<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
<input type="file" name="image[]">
PHP:
<?php
if (isset($_FILES[''image''])) {
foreach ($_FILES[''image''] as $file) {
if (!in_array($file[''type''], array("image/gif", "image/jpeg", "image/png"))
|| $file[''size''] > 500000) {
//error
} else {
//ok
}
}
}
No creo que realmente necesite una variable que se actualice a través de Javascript. Puede usar PHP para calcular cuántos archivos se han cargado al verificar el código de error . Puede manejar las cargas de archivos al verificar también la extensión del archivo, ya que diferentes navegadores a menudo pueden enviar diferentes tipos de MIME. Aquí hay un ejemplo de lo que estoy hablando:
$accepted_files = array(
''jpg'',
''png'',
''gif'',
''jpeg''
);
if ($_SERVER[''REQUEST_METHOD''] == ''POST'') {
foreach($_FILES as $key => $upload) {
if ($upload[''error''] == 0) {
$file_parts = explode (''.'',$upload[''name'']);
if (in_array($file_parts[sizeof($file_parts)-1], $accepted_files)) {
// This type of file is a-ok
}
else {
// Not an accepted file type
}
}
}
}
Puedes combinar todos los [''type''] == x || [''type''] == y en una sola llamada a in_array ($ _ FILES [...] [''type''], $ allowed)>
$ _FILES [..] [''type''] contiene datos enviados por el cliente que php no verifica ni desinfecta. Si el tipo de archivo es de alguna relevancia, no confíe en $ _FILES [..] [''type''] o en el sufijo $ _FILES [..] [''name'']. Solo el contenido real importa. Si es necesario, puede probarlo con la extensión fileinfo o mime_content_type () (que está marcado como obsoleto a favor de fileinfo)
Como otros han mencionado, la forma en que había agrupado sus condicionales estaba mal. Sin embargo, en lugar de simplemente agregar algunos paréntesis, sugiero que separe completamente las dos condiciones;
// this declaration + the use of in_array() isn''t necessary,
// it just makes things a bit cleaner.
$file_types = array("image/gif","image/jpeg","image/png");
if($_FILES["image$i"]["size"] < 500000)
{
if(in_array($_FILES["image$i"]["type"], $file_types)))
{
// do stuff
}
else
{
// error about file type
}
}
else
{
// error about file size
}
Tener esta separación hace que el código sea más legible y sugiere la jerarquía de condiciones más fácilmente, ADEMÁS, permite que sus mensajes de error sean más significativos. Es una buena práctica separar sentencias condicionales de diferentes tipos, de modo que cualquier mensaje de error siga siendo útil. Si su código arrojó un error tal como es, el usuario no tiene forma de saber (sin tener que farfullar sobre sí mismos) si su imagen era demasiado grande o no.