[PHP] multi upload immagine da form

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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:

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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.....
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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).
 

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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; }
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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.
 

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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"; 
    } 
} 
?>
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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.
 

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
Nell'ultima ho corretto (tra le altre cose) anche questa riga:
PHP:
$new_dir="$directory/".$file_name.time();
E non ricordo cosa altro.
 

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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...
 

Longo8

Utente Attivo
28 Mar 2011
1.694
0
36
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];
 

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
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
Autore Titolo Forum Risposte Data
N problema script php mysql multi upload immagini PHP 31
ANDREA20 [PHP] multi lingue PHP 1
P [PHP] Multi-session PHP 1
M Multi PHP su IIS 6 Web Server 1
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0

Discussioni simili