[PHP] multi upload immagine da form

  • Creatore Discussione Creatore Discussione Kirsolo
  • Data di inizio Data di inizio
ciao
Si, io impongo che l'utente carichi da 0 o al massimo 4 foto
e come lo imponi? con una nota vicino al form?
o fai quattro input o se usi il multiple devi controllare quante foto ha inputato ed eventalmente se supera le 4 eliminare (unset) le eccedenti.
oggi non posso domani ci do un occhio
 
ciao
e come lo imponi? con una nota vicino al form?
o fai quattro input o se usi il multiple devi controllare quante foto ha inputato ed eventalmente se supera le 4 eliminare (unset) le eccedenti.
oggi non posso domani ci do un occhio

Si l'idea mia è proprio questa, che se supera 4 di eliminare. Però non so implementarlo :/ se mi dai una mano sia con questo e con la query unica di INSERT...

grazie
 
Puoi ritoccare il codice che ti ho mandato.
Prendi comunque i primi 4 file (anche se l'utente ne carica di più) e li carichi tutti senza il ciclo.
Inizia a modificarlo e se hai qualche intoppo ci siamo.

EDIT: ho modificato il codice 'parzialmente funzionante'. Basati su questo per effettuare le modifiche necessarie.
PHP:
<?php
if(isset($_FILES['files'])){
    $estensioni = array("jpg", "png", "bmp", "gif"); 
    $errors= array();
	foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){
		$file_name = $_FILES['files']['name'][$key];
		$file_size =$_FILES['files']['size'][$key];
		$file_tmp =$_FILES['files']['tmp_name'][$key];
		$file_type=$_FILES['files']['type'][$key];	
        if($file_size > 2097152){
			$errors[]='La grandezza del file deve essere minore di 2 MB';
        }		
		if(!in_array(strtolower(end(explode('.', $file_name))),$estensioni)){
      		echo 'Tipo di file non consentito';    
		}    
        $query="INSERT into upload_data (`USER_ID`,`FILE_NAME`) VALUES('$user_id','$file_name'); ";
        $directory="foto";
        if(empty($errors)==true){
            if(is_dir($directory)==false){
                mkdir("$directory", 0700);		// Create directory if it does not exist
            }
            if(file_exists("$directory/".$file_name)==false){
                move_uploaded_file($file_tmp,"$directory/".$file_name);
            }else{  							// rename the file if another one exist
                 $new_dir="$directory/".time().$file_name;
                 rename($file_tmp,$new_dir) ;				
            }
		 mysql_query($query);			
        }else{
                print_r($errors);
        }
    }
	if(empty($error)){
		echo "Success";
	}
}
?>


<form action="" method="POST" enctype="multipart/form-data">
	<input type="file" name="files[]" multiple/>
	<input type="submit"/>
</form>
 
Ultima modifica:
PHP:
<?php 
if(isset($_POST['submit'])){

$estensioni = array("jpg", "png", "bmp", "gif");  
$errors= array(); 
//*************CONTROLLO TESTO****************
    $err="";//metti a vuoto una stringa 
    $nome=trim($_POST['nome']); //metto solo nome il titolo è simile 
    //reg_match('/^[a-z0-9]{5,15}/i' 
    if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20 
        $err.="non hai inserito il nome o nome non valido<br />";} 
	$prezzo=trim($_POST['prezzo'])+0.0; 
    if($prezzo==0 || !is_numeric($prezzo)){// potresti verificare anche che superi un certo valore 
        $err.="prezzo non valido<br />"; } 
//********FINE CONTROLLO TESTO **************
// ******* CONTROLLO IMG **********
		$cnt= 0; // contatore a 0
    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){ 
        $file_name = $key.$_FILES['files']['name'][$key]; 
        $file_size =$_FILES['files']['size'][$key]; 
        $file_tmp =$_FILES['files']['tmp_name'][$key]; 
        $file_type=$_FILES['files']['type'][$key];     
        if($file_size > 2097152){ 
            $errors[]='La grandezza del file deve essere minore di 2 MB'; 
        }         
        if(!in_array(strtolower(end(explode('.', $file_name))),$estensioni)){ 
              echo 'Tipo di file non consentito';     
        }     
        $query="INSERT into upload_data (`USER_ID`,`FILE_NAME`) VALUES('$user_id','$file_name'); "; 
        $directory="foto"; 
        if(empty($errors)==true){ 
            if(is_dir("$directory/".$file_name)==false){ 
                move_uploaded_file($file_tmp,"$directory/".$file_name); 
            }else{                                    // rename the file if another one exist 
                $new_dir="$directory/".$file_name.time(); 
                 rename($file_tmp,$new_dir) ;                 
            } 
         mysql_query($query);             
        }else{ 
                print_r($errors); 
        } 
    } 
    if(empty($error)){ 
        echo "Operazione effettuata con successo"; 
    } 
} 
?>

non so come implementare il conteggio del $cnt a 4 e poi unset
e non capisco la query INSERT TO.....
 
Per la query utilizza la tua se visto che i campi del db saranno diversi ovviamente stai attento ai valori che vai a mettere.
Per quanto riguarda gli errori elimina la variabile $err e usa solo $errors.
Fai un'ulteriore correzione: sostuituisci questo
PHP:
echo 'Tipo di file non consentito';
Con questo
PHP:
$errors[] = 'Tipo di file non consentito';

Questa è la stessa correzione che devi fare dove c'è $err.=...

Poi elimina il foreach visto che tu le prendi tutte e 4 insieme e prendi direttamente le prime 4 immagini (escludendo a priori le altre nel caso ce ne fossero).
 
Per la query utilizza la tua se visto che i campi del db saranno diversi ovviamente stai attento ai valori che vai a mettere.
Per quanto riguarda gli errori elimina la variabile $err e usa solo $errors.
Fai un'ulteriore correzione: sostuituisci questo
PHP:
echo 'Tipo di file non consentito';
Con questo
PHP:
$errors[] = 'Tipo di file non consentito';

Questa è la stessa correzione che devi fare dove c'è $err.=...

Poi elimina il foreach visto che tu le prendi tutte e 4 insieme e prendi direttamente le prime 4 immagini (escludendo a priori le altre nel caso ce ne fossero).

- Per sostituire $err. con $errors[] è ok.
- Perchè eliminare il foreach? ho messo $cnt=0; ma manca ancora tutto il controllo che se si seleziona piu d 4 foto le taglia con unset (come dice borgoitalia)....cosa che io non so fare :(
- Ho sostituito la tua query con la mia, però non so come richiamare l'im2,img3,img4.....sarebbe questa:
invece della tua
PHP:
$query="INSERT into upload_data (`USER_ID`,`FILE_NAME`) VALUES('$user_id','$file_name'); ";
la mia
PHP:
$sql = new mysql("localhost", "root", "", "my_db");
						$query="INSERT INTO prova(nome, prezzo,immagine,img2,img3,img4) 
						VALUES('$nome','$prezzo','prova/...','','','')";  
						var_dump($query);//e qui verifichi che venga scritta come dovrebbe
						if(!$sql->query($query)) { 
							echo $sql->error; }
 
Per vedere i come prendere i nomi dei 4 file fai un:
PHP:
var_dump($_FILES['files']['tmp_name']);
Vedi come è organizzato il dato e a quel punto vai a prendere i vari valori desiderati.
Fai delle prove.
 
Per vedere i come prendere i nomi dei 4 file fai un:
PHP:
var_dump($_FILES['files']['tmp_name']);
Vedi come è organizzato il dato e a quel punto vai a prendere i vari valori desiderati.
Fai delle prove.

non ci capisco :#

ho provato a cambiare con una form a 4 input...magari è piu semplice.
Però non ci riesco lo stesso, qualcuno mi riesce a postare una versione funzionante? :#
PHP:
<?php 
if(isset($_POST['submit'])){

$estensioni = array("jpg", "png", "bmp", "gif");  
$errors= array(); 
//*************CONTROLLO TESTO****************
    $nome=trim($_POST['nome']); //metto solo nome il titolo è simile 
    //reg_match('/^[a-z0-9]{5,15}/i' 
    if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20 
        $errors[]="non hai inserito il nome o nome non valido<br />";} 
	$prezzo=trim($_POST['prezzo'])+0.0; 
    if($prezzo==0 || !is_numeric($prezzo)){// potresti verificare anche che superi un certo valore 
        $errrors[]="prezzo non valido<br />"; } 
//********FINE CONTROLLO TESTO **************

    foreach($_FILES['files']['tmp_name'] as $key => $tmp_name ){ 
		$nomefile = strtolower($key);
        $file_name = $key.$_FILES['files']['name'][$key]; 
        $file_size =$_FILES['files']['size'][$key]; 
        $file_tmp =$_FILES['files']['tmp_name'][$key]; 
        $file_type=$_FILES['files']['type'][$key];     
        if($file_size > 2097152){ 
            $errors[]='La grandezza del file deve essere minore di 2 MB'; 
        }         
        if(!in_array(strtolower(end(explode('.', $file_name))),$estensioni)){ 
              $errors[] = 'Tipo di file non consentito';     
        } 
		$directory="provaF"; 
        $sql = new mysql("localhost", "root", "", "my_db");
						$query="INSERT INTO prova(nome, prezzo,immagine,img2,img3,img4) 
						VALUES('$nome','$prezzo','provaF/$nomefile','provaF/$nomefile2','provaF/$nomefile3','provaF/$nomefile4')";  
						var_dump($query);//e qui verifichi che venga scritta come dovrebbe
						if(!$sql->query($query)) { 
							echo $sql->error; } 
        
        if(empty($errors)==true){ 
            if(is_dir("$directory/".$file_name)==false){ 
                move_uploaded_file($file_tmp,"$directory/".$file_name); 
            }else{                                    // rename the file if another one exist 
                $new_dir="$directory/".$file_name.time(); 
                 rename($file_tmp,$new_dir) ;                 
            } 
         mysql_query($query);             
        }else{ 
                print_r($errors); 
        } 
    } 
    if(empty($error)){ 
        echo "Operazione effettuata con successo"; 
    } 
} 
?>
 
Intanto stai usando la prima versione che ho pubblicato. Ho pubblicato una seconda versione in cui ho corretto qualcosa.
I file li carica ma con il db devi vedere come prendere i dati dal vettore, è tutto qui.
 
Intanto stai usando la prima versione che ho pubblicato. Ho pubblicato una seconda versione in cui ho corretto qualcosa.
I file li carica ma con il db devi vedere come prendere i dati dal vettore, è tutto qui.

Ho preso la tua ultima che hai postato e modificato qualcosa:
- aggiunto controlli del testo
- aggiunto connex al db e la query insert to
 
Nell'ultima ho corretto (tra le altre cose) anche questa riga:
PHP:
$new_dir="$directory/".$file_name.time();
E non ricordo cosa altro.
 
ciao
ripartiamo:
posta la query che stai usando e il dump della tabella

ti posto tutto:
PHP:
<form id="provaF" enctype="multipart/form-data" method='post' action="<?php echo $_SERVER['PHP_SELF'] ?>">
<p>
<label for="nome">Nome</label>
<input type="text" name="nome" id="nome" /></p>
<p><label for="prezzo">prezzo</label>
<input type="text" name="prezzo" id="prezzo" /></p>
<p>
        <input name="image[]" type="file" size="40" multiple="multiple"/>   
        
<p>
 <input type="submit" name="submit" id="submit" value="Invia Messaggio" />
 </p>
</form>

<?php 
if(isset($_POST['submit'])){ 
	
    $err="";//metti a vuoto una stringa 
    $nome=trim($_POST['nome']); //metto solo nome il titolo è simile 
    //reg_match('/^[a-z0-9]{5,15}/i' 
    if(!preg_match('/^[a-zA-Z]{2,20}$/', $nome)){//verifico che siano solo lettere min 2 max 20 
        $err.="non hai inserito il nome o nome non valido<br />";//concateno gli errori 
	} 
	$prezzo=trim($_POST['prezzo'])+0.0; 
    if($prezzo==0 || !is_numeric($prezzo)){// potresti verificare anche che superi un certo valore 
        $err.="prezzo non valido<br />"; 
    } 
	else {
	//************* INIZIO CONTROLLLO CARICAMENTO IMMAGINI ***************
	var_dump($_FILES['image']);//da questa vedi come viene costruito l'array provando a caricare più immagini 
    echo "</pre>"; 
	// limite peso in byte 
	$peso_max = 1024 * 1024;
	// inizializziamo il messaggio
	$messaggio = "Carica una o piu immagini, fino ad un massimo di 4 consentite:";
	// estensioni ammesse
	$estensioni = array("jpg", "png", "bmp", "gif");
	// percosrso destinazione immagini la cartella deve esistere e il percorso deve essere corretto
	$cartella = "../provaF";
	// verifichiamo che l'utente abbia selezionato un file   
    if(trim($_FILES["submit"]["name"]) == '')   
      {   echo 'Non hai selezionato nessun file!';   }  
    // verifichiamo che il file è stato caricato   
    else if(!is_uploaded_file($_FILES["submit"]["tmp_name"]) or $_FILES["submit"]["error"]>0)   
      {    echo 'Si sono verificati problemi nella procedura di upload!';    }   
    // verifichiamo che il tipo è fra quelli consentiti   
    else if(!in_array(strtolower(end(explode('.', $_FILES["submit"]["name"]))),$estensioni))   
      {    echo 'Il file che si desidera uplodare non è fra i tipi consentiti!';    }   
    // verifichiamo che la dimensione del file non eccede quella massima   
    else if($_FILES["submit"]["size"] > $max_byte)   
      {   echo ' eccede la dimensione massima!';  }  
    // verifichiamo che la cartella di destinazione settata esista   
    else if(!is_dir($cartella))   
        {    echo 'La cartella in cui si desidera salvare il file non esiste!';   }     
    // verifichiamo il successo della procedura di upload nella cartella settata   
    else if(!move_uploaded_file($_FILES["submit"]["tmp_name"], $cartella_upload.$_FILES["submit"]["name"]))   
      {    echo 'Ops qualcosa è andato storto nella procedura di upload!';    }   
   
    // altrimenti significa che è andato tutto ok   
     else   
      { 
	  $sql = new mysql("localhost", "root", "", "luca_db");
						$query="INSERT INTO prova(nome, prezzo,immagine,img2,img3,img4) 
						VALUES('$nome','$prezzo','prova/...','','','')";  
						var_dump($query);//e qui verifichi che venga scritta come dovrebbe
						if(!$sql->query($query)) { 
							echo $sql->error; }
      echo 'Upload eseguito correttamente!'; 
	  //e torni al form pulito dopo 100 secondi 
    echo "<meta http-equiv='Refresh' content='100; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
      }   
    }   	    
}
?>

errori e dump :
array(5) { ["name"]=> array(2) { [0]=> string(39) "947064_365224873588321_1617591454_n.jpg" [1]=> string(19) "20130707_101727.jpg" } ["type"]=> array(2) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" } ["tmp_name"]=> array(2) { [0]=> string(51) "C:\Program Files (x86)\EasyPHP-12.1\tmp\php96A8.tmp" [1]=> string(51) "C:\Program Files (x86)\EasyPHP-12.1\tmp\php96B9.tmp" } ["error"]=> array(2) { [0]=> int(0) [1]=> int(0) } ["size"]=> array(2) { [0]=> int(62239) [1]=> int(1241222) } }
Notice: Undefined index: submit in C:\Program Files (x86)\EasyPHP-12.1\www\Tropina\form\provaF.php on line 41
Non hai selezionato nessun file!


Questo è il mio vecchio di partenza...però non so andare avanti...
 
Dal dump puoi evincere che $_FILES['image']['name'] è un array che contiene tutti e 4 i nomi delle 4 immagini.
Per prenderli:
PHP:
$immagine1 = $_FILES['image']['name'][0];
$immagine2 = $_FILES['image']['name'][1];
$immagine3 = $_FILES['image']['name'][2];
$immagine4 = $_FILES['image']['name'][3];
 
Dal dump puoi evincere che $_FILES['image']['name'] è un array che contiene tutti e 4 i nomi delle 4 immagini.
Per prenderli:
PHP:
$immagine1 = $_FILES['image']['name'][0];
$immagine2 = $_FILES['image']['name'][1];
$immagine3 = $_FILES['image']['name'][2];
$immagine4 = $_FILES['image']['name'][3];

Ho provato a mettere queste 4 righe dopo la dichiarazione della cartella : $cartella = "../provaF";

e modificando la query in:
PHP:
$query="INSERT INTO prova(nome, prezzo,immagine,img2,img3,img4) 
						VALUES('$nome','$prezzo','provaF/imagine1','provaF/imagine2','prova/imagine3','prova/imagine4')";

errorie e dump:
array(5) { ["name"]=> array(4) { [0]=> string(19) "20130424_201933.jpg" [1]=> string(19) "20130707_101727.jpg" [2]=> string(7) "b&w.jpg" [3]=> string(9) "prova.jpg" } ["type"]=> array(4) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" [2]=> string(10) "image/jpeg" [3]=> string(10) "image/jpeg" } ["tmp_name"]=> array(4) { [0]=> string(51) "C:\Program Files (x86)\EasyPHP-12.1\tmp\phpC8E9.tmp" [1]=> string(51) "C:\Program Files (x86)\EasyPHP-12.1\tmp\phpC976.tmp" [2]=> string(51) "C:\Program Files (x86)\EasyPHP-12.1\tmp\phpC997.tmp" [3]=> string(51) "C:\Program Files (x86)\EasyPHP-12.1\tmp\phpC9A7.tmp" } ["error"]=> array(4) { [0]=> int(0) [1]=> int(0) [2]=> int(0) [3]=> int(0) } ["size"]=> array(4) { [0]=> int(85451) [1]=> int(1241222) [2]=> int(63525) [3]=> int(7474) } }
Notice: Undefined index: submit in C:\Program Files (x86)\EasyPHP-12.1\www\Tropina\form\provaF.php on line 45
Non hai selezionato nessun file!
 

Discussioni simili