[PHP] multi upload immagine da form

  • Creatore Discussione Creatore Discussione Kirsolo
  • Data di inizio Data di inizio

Kirsolo

Utente Attivo
17 Gen 2013
171
0
0
Salve, qualcuno mi può aiutare a realizzare il controllo di una form che upload 4 immagini nella cartella nel server ed il suo url nel database?
Son settimane che mi ci imbatto, ma senza esito :(

i controlli sono:
- che sia un immagine (.jpg, .bmp, .gif)
- il peso dell'immagine ( entro i 2M)
- e che siano al max 4 img

grazie
 
ciao
prova a cercare qui, da qualche parte c'è un 3d che ne parla

Avevo cercato, ma senza buoni risultati per me.
Il problema è come gestire più foto, non so farlo.
Poi sarebbe meglio mettere un input solo con la possibilità di uppare 4 foto che vanno in 4 record della tabella del db oppure 4 input , uno per ogni foto?
 
ciao
puoi usare l'input file multiple
HTML:
<input name="immagine[]" type="file" multiple >
oppure
quattro input file
HTML:
<input name="immagine[]" type="file">
<input name="immagine[]" type="file">
<input name="immagine[]" type="file">
<input name="immagine[]" type="file">
il secondo, a mio parere, per l'utente è più intuitivo, l'importante per facilitare il controllo è che il name sia un array
name="immagine[]"
poi per vedere come si sviluppa nella parte php del submit
PHP:
<?php
if(isset($_POST['submit'])){
	//...
	echo "<pre>";
	var_dump($_FILES['immagine']);//da questa vedi come viene costruito l'array provando a caricare più immagini
	echo "</pre>";
	//......
}
//...
?>
prova a buttare giu qualcosa, poi ti do una mano
 
provo darti uno spunto

PHP:
<form id="uploader" action="upload.php" method="post" enctype='multipart/form-data'>
<input id="file" name="f[]" type="file" multiple="multiple">
<input type="submit" value="carica">
</form>

PHP:
$l = $_FILES['f']['name'];
 
foreach ($l as $nomefile) {
   $file = basename($nomefile);

move_uploaded_file($file,"upload/");

}

non so se ti và bene fammi sapere ciao...
 
Ultima modifica:
provo darti uno spunto

PHP:
<form id="uploader" action="upload.php" method="post" enctype='multipart/form-data'>
<input id="file" name="f[]" type="file" multiple="multiple">
<input type="submit" value="carica">
</form>

PHP:
$l = $_FILES['f']['name'];
 
foreach ($l as $nomefile) {
   $file = basename($nomefile);

move_uploaded_file($file,"upload/");

}


non so se ti và bene fammi sapere ciao...

ho provato a metter giu qualche riga...
HTML:
 <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"/>   
        <!-- <input name="upload" type="submit" value="Carica immagini e visualizza" /></p> -->	
<p>
 <input type="submit" name="submit" id="submit" value="Invia Messaggio" />
 </p>
</form>
PHP:
<?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_numerica($prezzo)){// potresti verificare anche che superi un certo valore 
        $err.="prezzo non valido<br />"; 
    } 
	else {
	//************* INIZIO CONTROLLLO CARICAMENTO IMMAGINI ***************
	var_dump($_FILES['immagine']);//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["upload"]["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", "", "x");
						$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'])."'>";
      }   
    }   	    
}
?>

come richiamo le immagini su INSERT INTO ? prova/... poi?
 
ciao
stasera non posso spiegarti bene, però attento quando ci si fa caricare dei file qualcuno potrebbe inviarti un_bel_visus.exe, senza contre che portevbbe caricarti un'immagine da 10MB, prima du uplod si deve fare i controlli
 
ciao
stasera non posso spiegarti bene, però attento quando ci si fa caricare dei file qualcuno potrebbe inviarti un_bel_visus.exe, senza contre che portevbbe caricarti un'immagine da 10MB, prima du uplod si deve fare i controlli

ma se cè il controllo sulle estensioni?! come fa?
 
"INSERT INTO prova(nome, prezzo,immagine,img2,img3,img4) non capisco perche hai messo quatro attributi per le immagini...

per estrarre le immagini scrivi una cosa cosi:

PHP:
$team = nome;// per estrarre un immagine secondo il nome
$query = "SELECT * FROM prova WHERE team='$team'";
$risultato = mysql_query($query) or die (mysql_error());
$r = mysql_fetch_array($risultato);

echo $r['immagine'];

p.s. non è un codice che funziona
 
Non credo che in questo modo tu stia creando un multi-upload.
Provo a prenderne uno tra gli archivi :)
Tempo fa funzionava anche se, come puoi vedere, uso mysql.
L'ho appena testato e funziona.
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 = $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)==false){
                mkdir("$directory", 0700);		// Create directory if it does not exist
            }
            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";
	}
}
?>
<form action="" method="POST" enctype="multipart/form-data">
	<input type="file" name="files[]" multiple/>
	<input type="submit"/>
</form>
 
Non credo che in questo modo tu stia creando un multi-upload.
Provo a prenderne uno tra gli archivi :)
Tempo fa funzionava anche se, come puoi vedere, uso mysql.
L'ho appena testato e funziona.
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 = $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)==false){
                mkdir("$directory", 0700);		// Create directory if it does not exist
            }
            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";
	}
}
?>
<form action="" method="POST" enctype="multipart/form-data">
	<input type="file" name="files[]" multiple/>
	<input type="submit"/>
</form>
Ciao, ancora non l'ho provato, ma ho soltanto dato un occhiata...ti devo chiedere un paio di cose:
1) non mi serve che crei la directory 0700 perchè cè già una nel server, creando una di nome sbagliato poi non mi richiamerebbe le foto nel sito
2) non capisco bene cosa hai fatto nella query di insert into
3) manca la connessione al db o sbaglio?
4) purtroppo è una form e non ho solo il multiupload di immagine ma anche 2 controlli di testo da fare, dove li metto? subito dopo ISSET e prima di $estensioni?

grazie
 
ciao
puoi metterli prima o dopo il foreach per il controllo dei file comunque dopo $errors= array();

Grazie, ma la connessione al db e la query per inserire il testo nel db?

nb: qui rispondo ad un post precedente, ho al max 4 img da inserire ed ogni immagine deve andare in un record della tabella, non tutte e 4 in un'unico record.
 
ciao
ma la connessione al db
i dati di connessione li metterei nell'if quando tutto è ok
non tutte e 4 in un'unico record.
questo sta a te:
devi salvare anche il testo (hai 4 testi?), se hai un testo solo e 4 foto o

fai una tabella apposita per i testi
id_uno | id_utente | testo

e una per le foto
id _due | id_uno | nome_file (qui id_uno serve per collegare con la join le immagini al testo)


o la tabella deve avere oltre al campo del testo 4 campi per i 4 nomi_file
id | id_utente | testo | imm_1 | imm_2 | imm_3 | imm_4

edit dimenticavo
secondo quello che fai devi poi fare le/la query
 
Ultima modifica:
ciao
dimenticavo ancora
se fai il campo di input file multiple devi mettere nei controlli anche un contatore in modo che uno non ti carichi più di 4 foto, cosa non possibile se fai 4 campi di input files
 
ciao
dimenticavo ancora
se fai il campo di input file multiple devi mettere nei controlli anche un contatore in modo che uno non ti carichi più di 4 foto, cosa non possibile se fai 4 campi di input files

L'ultima tua idea è la mia ovvero la tabella con :

id | nome | prezzo | immagine | img2 | img3 | img4

diciamo che o 4 input o un unico input con contatore a me non cambia, devo farlo in qualche modo funzionare , con le buone o con le cattive! =)

In ogni caso come inserisco il contatore?
Non ho ben capito cosa intendi con le query?
Io vorrei che ci fosse un unico INSERT INTO con i valori di testo e le foto...non so se mi spiego
 
Intanto spiega perchè le 4 immagini le vuoi mettere tutte su una riga.
Se in futuro uno ne vuole inserire una quinta? oppure tu dai la possibilità di inserire una quinta o una sesta, non è che vai a modificare le tabelle ma basta inserire un altro record nella tabella immagini che è collegata con una relazione uno:molti con quella UTENTE (un utente può caricare più immagini).
Poi il limite lo controlli facilmente e per quanto riguarda la connessione al db avevo una riga che includeva il file di connessione ma l'ho tolta prima di pubblicare quindi basta inserire 2 righe di codice poco prima dell'esecuzione della query.
 
ciao
@kirsolo
intendo le query perche se fai due tabelle devi fare due query di insert (tra l'altro prelevando gli id relativi al testo), se fai una riga sola (una tabella) devi fare una query sola.

@longo
dipende, se ho predisposto una pagina che possa visualizzare solo 4 immagini e il testo è inutile che l'utente ne carichi 5 o più (mi intasa solamente il server), se decido che ne possa caricare solo 4 eventualmente e se l'utente vuole cambiarle/a: prima le/la elimina poi ricarica le/la nuove/a, comunque un limite conviene metterlo
 
ciao
@kirsolo
intendo le query perche se fai due tabelle devi fare due query di insert (tra l'altro prelevando gli id relativi al testo), se fai una riga sola (una tabella) devi fare una query sola.

@longo
dipende, se ho predisposto una pagina che possa visualizzare solo 4 immagini e il testo è inutile che l'utente ne carichi 5 o più (mi intasa solamente il server), se decido che ne possa caricare solo 4 eventualmente e se l'utente vuole cambiarle/a: prima le/la elimina poi ricarica le/la nuove/a, comunque un limite conviene metterlo

Si, io impongo che l'utente carichi da 0 o al massimo 4 foto. Quindi non può per certo caricarne più di 4.
Come detto ho una form con ( nome , prezzo , immagine ,img2, img3 , img4) e la tabella ( id | nome | prezzo | immagine | img2 | img3 |img4 ) , quindi i dati vanno inseriti corrispondentemente. Poi li richiamo io con una funzione in modo di visualizzarli nel modo che voglio io. Non so se mi sono spiegato.
 

Discussioni simili