strano comportamento di $_FILES nel controllo

  • Creatore Discussione Creatore Discussione aganju
  • Data di inizio Data di inizio

aganju

Nuovo Utente
5 Feb 2013
10
0
0
Ciao,

ho un strano comportamento in uno script per quanto riguarda l'upload immagini.
Ho una pagina di modifica prodotti e quindi anche delle immagini.
La funzione logica della pagina è che se nella modifica del prodotto non seleziono immagini, lo script "salta" il passaggio per l'upload e continua con il resto dello script.
il punto è che nonostante abbia messo un controllo su $_FILES dopo l'invio del form,
$_FILES['fleImage']['name'] risulta sempre NON vuoto.
Eppure con print_r($_FILES) se non seleziono un immagine, all'invio del form, mi dice giustamente il contrario.
PHP:
echo"<pre>";  
print_r($_FILES);  
echo"</pre>";  

$name = $_FILES['fleImage']['name'];  
if (empty($name))  
{ echo "è vuoto";  
} else { 
echo "Non è vuoto";}

mi sono allora creato una semplice pagina di prova con il form e i controlli uguali alla pagina originale
PHP:
<!DOCTYPE html>  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
</head>  
<body>  

<form action="" method="post" enctype="multipart/form-data" name="prova">  
<input name="fleImage" type="file" id="fleImage" class="box" multiple="multiple">  
<input name="ciao" type="submit" value="Modifica Prodotto">  
</form>  

<?php  
echo"<pre>";  
print_r($_FILES);  
echo"</pre>";  

$name = $_FILES['fleImage']['name'];  
if (empty($name))  
{ echo "é vuoto";  
} else {echo "Non è vuoto";} ?>  
</body>  
</html>
questa pagina di test invece funziona correttamente.
ma perchèèè??? quali sono le differenze?
illuminatemi :dipser:
 
Se anche nessun file viene selezionato la variabile viene inviata, quindi ti consiglio di controllare se effettivamente c'è stato un upload locale temporaneo, cioè se c'era veramente un file

PHP:
 echo !empty($_FILES['fleImage']['tmp_name']) ? "File inviato" : "Nessun file inviato";
 
umhh..

PHP:
echo"<pre>";
print_r($_FILES);
echo"</pre>";

 echo !empty($_FILES['fleImage']['tmp_name']) ? "File inviato" : "Nessun file inviato";  

if (empty($_FILES['fleImage']['tmp_name'])) {

echo "é vuoto"; 
} else {
echo "Non è vuoto";
}
 }

mi dice che il file è stato inviato....

Non ho capito come funziona questa storia. Cioè, anche se non invio un file, $_FILES['fleImage']['tmp_name'] viene valorizzato lo stesso? Se si, come faccio a risolvere questo problema?

grazie per la risposta!
 
Bah forse combini qualcos'altro prima perché a me funziona perfettamente in locale, anche inviando un form col file vuoto o senza form
 
anche a me funziona utilizzando quella pagina di prova che ho postato all'inizio.
Comunque, nel caso che mi interessa, non credo di fare cose complicate da determinare questo malfunzionamento. Ti spiego brevemente.

dal form di modifica invio (o non invio) i dati:
Codice:
<form action="processProduct.php?action=modifyProduct&productId=<?php echo $productId; ?>" method="post" enctype="multipart/form-data" name="frmAddProduct" id="frmAddProduct">

e li invio al file processProduct.php che tramite uno switch, in base all' $action che riceve, processa i dati tramite una funzione:

PHP:
$action = isset($_GET['action']) ? $_GET['action'] : '';

switch ($action) {

case 'modifyProduct' :
		prova();
		break;

}

function prova()
{


echo"<pre>";
print_r($_FILES);
echo"</pre>";

 echo !empty($_FILES['fleImage']['tmp_name']) ? "File inviato" : "Nessun file inviato";  

if (empty($_FILES['fleImage']['tmp_name'])) {

echo "é vuoto"; 
} else {
echo "Non è vuoto";
}
 }

tutto qui! Non mi sembra che sia una cosa complicata o no? :crying:
 
A me funziona correttamente utilizzando un form di prova e lo stesso codice quindi mi viene da chiederti se per caso tu non invii ugualmente il file, sennò a questo punto non so che dirti dato che non ci sono errori
 
quindi mi viene da chiederti se per caso tu non invii ugualmente il file

ma quale file? :dipser:

se con print_r($_FILES) mi dice che l'array è vuoto...

Codice:
Array
(
    [fleImage] => Array
        (
            [name] => Array
                (
                    [0] => 
                )

            [type] => Array
                (
                    [0] => 
                )

            [tmp_name] => Array
                (
                    [0] => 
                )

            [error] => Array
                (
                    [0] => 4
                )

            [size] => Array
                (
                    [0] => 0
                )

        )

)

ma con !empty() mi dice che non lo è!
Come si fa a capire dov'è il problema? a parte print_r, dato che non ci sono errori come si può risalire o cosa si può fare per capire cosa c'è li che rompe i maroni??:incazz:

Grazie comunque per l'aiuto Nefyt
 
Non avevo mica visto che il campo è col multiple attivo :vampiro:, quindi come ti dice il print_r sono degli array contenenti tutti i dati dei file, fai un controllo di questo genere

PHP:
echo count($_FILES['fleImage']['tmp_name'])>0 ? 'File inviati' : 'Nessun file inviato';
//premessa operatore ternario o normale costrutto if/else non cambia niente, abbrevia solamente
 
si ho fatto, ma a cosa serve? non cambia nulla. Il print_r mi stampa sempre la stessa cosa che ho postato prima e mi dice sempre file inviato
 
si ho fatto, ma a cosa serve? non cambia nulla. Il print_r mi stampa sempre la stessa cosa che ho postato prima e mi dice sempre file inviato

Devi contare i file inviati oppure controlli il valore, in pratica non puoi trattare quelli come stringhe dato che sono degli array perché il multiple è attivo, quindi devi controllare i loro elementi

Con empty prova cosi
PHP:
echo !empty($_FILES['fleImage']['tmp_name'][0]) ? 'Almeno un file è stato inviato' : 'Nessun file inviato';
 
Ultima modifica:
ciao
scusate ma forse è la mia solita pu.....ta, ma ho notato che il print_r restituisce
Array
(
[fleImage] => Array
(
[name] => Array
(
[0] =>
)

[type] => Array
(
[0] =>
)

[tmp_name] => Array
(
[0] =>
)

[error] => Array
(
[0] => 4
)

[size] => Array
(
[0] => 0
)

)
da cui [fleImage][name] è a sua volta un array
per cui non sarebbe da fare
$name = $_FILES['fleImage']['name'][0];
?
non ho mai usato l'attributo multiple, ma intuisco se uno seleziona due file il print_r dovrebbe restituire
Array
(
[fleImage] => Array
(
[name] => Array
(
[0] => file_1.jpg
[1] => file_2.jpg
)
eccc....
o il mio è un racionamento sbagliato

edit
nefyt: ci siamo incrociati
 
Ultima modifica:
PHP:
!empty($_FILES['fleImage']['tmp_name'][0]

ecco la soluzione!! porca @]*! :quote: tutta colpa di quel <input name="fleImage[]"> Non sapevo che nel caso di [] nel $_FILES bisognava ragionare come un array anche se vuoto!!

grazie Nefyt avanzi una bella birrozza! :fonzie:
 

Discussioni simili