Upload file

  • Creatore Discussione Creatore Discussione sixdas
  • Data di inizio Data di inizio

sixdas

Utente Attivo
25 Giu 2012
70
0
6
Come già scritto, sto cercando di realizzare uno script, per gestire file con un area di amministrazione. Ora mi servirebbe qualche consiglio che su come realizzare una pagina dove caricare i file tramite un form, dargli un nome una descrizione e assegnarlo a un utente specifico del sito. Al momento seguendo una guida riesco solo a caricare il file sul server, ma mi manca tutto il resto. Potete darmi una mano?

GRazie.
 
ciao
ti schematizzo
prima devi fati il form, ricordandoti che devi mettere, visto che devi caricare dei file, enctype="multipart/form-data"
HTML:
<form action="nome_della_pag_che_carica.php" method="post" enctype="multipart/form-data">
<!-- altri vari campi di input e quallo per il file-->

<input name="nome_file" type="file" id="nome_file" size="40">
<br>
<input name="invia" type="submit" id="invia" value="invia">
</form>
poi la parte php
PHP:
<?php
//...........
$cartella="pinco/";//se devi caricare in una cartella specifica
//poi caricando dei file è essenziale verificare che tipo di file sono
$tipi_ammessi=array('jpg','gif','png','txt');// e/o altri
$estenzione=pathinfo($_FILES['nome_file']['name'], PATHINFO_EXTENSION); 
if(in_array($estenzione,$tipi_ammessi)){
	$file_da_caricare=$cartella.$_FILES['nome_file']['name'];
	if(move_upload_file($_FILES['nome_file']['tmp_name'], $file_da_caricare)){
		echo "file caricato";
	}else{
		echo "errore nel caricamento";
	}
}else{
	echo "tipo file non ammesso";
}
//.....
?>
per assegnare ad un utente specifico potresti trasmettere dal form il nome dell'utente e mettere il file nella sua cartella
verifica però di avere i permessi di scrittura nella cartella
poi puoi fare una pagina unica
 
Ultima modifica:
Puoi postare i sorgenti attuali? Così vediamo di modificare quelli.

ecco:
HTML:
<html>
<form name="upload" method="post" action="upload.php" enctype="multipart/form-data">
<input type="file" name="uploadfile"> 
<input type="submit" name="go" value="Carica"></form>
</html>

PHP:
<?php 
 
if ($_FILES['uploadfile']['error'] == 0){ 

	if ($_FILES['uploadfile']['type'] != "image/gif") 
	
	die ("Formato file non valido, è permesso solo il formato gif");  

		copy($_FILES['uploadfile']['tmp_name'], "doc/".$_FILES['uploadfile']['name']) 
		
		or die("Impossibile caricare il file"); 

	echo "Upload terminato con successo:<br>"; 
	echo "Nome file: ".$_FILES['uploadfile']['name']."<br>"; 
	echo "Dimensione file: ".$_FILES['uploadfile']['size']."<br>"; 
	echo "Tipo MIME file: ".$_FILES['uploadfile']['type']; 
} 
else{ 

if ($_FILES['uploadfile']['error'] == 2){ 
 
die("Errore, file troppo grande: il massimo consentito è 1MB"); 
} 
else{ 

die("Errore, impossibile caricare il file"); 
} 
} 
?>

@Borgo

Adesso do un occhiata al tuo codice...Vediamo se riesco a capirci qualcosa. :byebye:
 
ciao
così a occhio lo script che hai fatto mi sembra ok , l'unica cosa che avrei fatto di diverso è che al posti di copy avrei usato move_upload_file o in alternativa rename e al psto di if ($_FILES['uploadfile']['error'] == 2) avrei usato $_FILES['uploadfile']['size'] > 1000000 (circa)
 
Ciao, allora adesso riesco a caricare il file, associarlo all'utente e dargli un nome e descrizione. Mi resta da capire ancora alcune cose:

1) Volevo utilizzare il codice di borgo, ma mi da errore nella funzione move_upload_file, e anche modificando il mio mi da lo stesso, ecco l'errore esatto: Fatal error: Call to undefined function move_upload_file() in E:\xampp\htdocs\archivio\up\upload.php on line 13
2) Mi conviene utilizzare una sola cartella "doc" dove carico tutto dentro, oppure creare una cartella per ogni cliente?
3) Una volta caricato il file come recupero il suo percorso? io ho provato cosi ma non so se sia il metodo migliore:
PHP:
$x = "doc/".$_FILES['uploadfile']['name'];
Dopo nella aerea priva come lo estraggo in modo da poter visualizzare i link per scaricarlo?

Grazie mille.
 
Allora sono riuscito a fare una prova estraggo i link in questo modo:
PHP:
<td><a href="'. $row['file'] .'">link</a></td>

Ora ho un altro problema , io utilizzo un file count per segnalare nel db che l'utente ha scaricato il file, come collego le due cose?
Attualmente per far aumentare i count ho utilizzato la guida di questo sito:
PHP:
<td><a href="redirect.php?id=' . $row['id_doc'] . '">leggi</a></td>
 
ciao
per l'errore
Fatal error: Call to undefined function move_upload_file() in E:\xampp\htdocs\archivio\up\upload.php on line 13
come al solito ha ragione php, mi sono dimenticato nella "penna" un ed

move_uploaded_file

non move_upload_file
 
Ciao,

Non ci ero arrivato, adesso funziona. Diciamo che la base c'è, adesso vorrei perfezionarla...qui potete vedere un esempio link potete dare un sguardo e dirmi se funziona bene?

Mentre per caricare: link i nomi dei clienti nella select vengono estratti dalla tabella del db.

Per accedere : Nome: mario password: casa, oppure provate se il form di registrazione funziona bene :D

Grazie mille.
 
Ultima modifica:
Domanda, è possibile, riadattare il codice per caricare più file contemporaneamente?
 
ciao
ci do un occhio e poi spero di saperti dire qualcosa
dimentivavo:
posta il form e lo script funzioananti che stai utilizzando
 
Ultima modifica:
Ciao, ecco:

Form:
PHP:
<html>
<form name="upload" method="post" action="upload.php" enctype="multipart/form-data">
<label>Nome</label><input name="nome" type="text"><br>
<label>Descrizione</label><input name="desc" type="text"><br>
<label>Seleziona Cliente</label><select name="cliente">
<?php
include_once ('config.php');
$ric = mysql_query("SELECT id, nome, cognome FROM clienti ");

while ($row = mysql_fetch_assoc($ric)) { 
     
echo "<option value=" . $row['id'] . ">" . $row['nome']. "&nbsp;" . $row['cognome'] . "</option>";  
}    
?>     
</select><br>
<input name="nome_file" type="file" id="nome_file" size="40">
<input type="submit" name="go" value="Carica"></form>
</html>

Script:
PHP:
<?php
$cartella="doc/";//se devi caricare in una cartella specifica
//poi caricando dei file è essenziale verificare che tipo di file sono
$tipi_ammessi=array('jpg','gif','png','txt','pdf');// e/o altri
$estenzione=pathinfo($_FILES['nome_file']['name'], PATHINFO_EXTENSION); 
if(in_array($estenzione,$tipi_ammessi)){
    $file_da_caricare=$cartella.$_FILES['nome_file']['name'];
    if(move_uploaded_file($_FILES['nome_file']['tmp_name'],$file_da_caricare)){
        echo "file caricato";

//QUERY DI INSERIMENTO NEL DATABASE
		
$date = (date("d/m/Y"));
$nome = $_POST['nome'];
$desc = $_POST['desc'];
$cl = $_POST['cliente'];

require ('config.php');

$sql = "INSERT INTO doc (id, nome, descizione, data, file) VALUES ('$cl','$nome','$desc','$date','$file_da_caricare')";
$res = mysql_query($sql); 

//invio email

$ric = mysql_query("SELECT mail FROM clienti WHERE id ='$cl'");
while ($row = mysql_fetch_assoc($ric))

$mittente = 'From: "Il mio nome" <info@sito.com> \r\n';
$reply = "Reply-to: miaemail@email.com\r\n";  
$destinatario = $row['mail']; 
$oggetto = "Archivio: hai un nuovo documento disponibile"; 
$messaggio = 
"Gentile Cliente, \n
è stato creato un nuovo documento. \n
Nome:  $nome; \n
Cordiali Saluti.";
mail($destinatario, $oggetto, $messaggio, $mittente.$reply); 

if (!$res) {
	die("Errore nella query $sql: " . mysql_error());
}
// chiudo la connessione a MySQL
mysql_close();
				
    }else{
        echo "errore nel caricamento";
    }
}else{
    echo "tipo file non ammesso";
}
?>
 
ciao
una domanda
<label>Descrizione</label><input name="desc" type="text"><br>
la descrizione si riferisce alla descrizione del documento?
poi io limiterei il numero massimo di file inseribile alla volta (es 3)
sappimi dire
 
ciao
una domanda
<label>Descrizione</label><input name="desc" type="text"><br>
la descrizione si riferisce alla descrizione del documento?
poi io limiterei il numero massimo di file inseribile alla volta (es 3)
sappimi dire

Si, e un campo per la descrizione del file, per il numero anche io direi che 3 sono più che sufficienti.
 
ciao
ho provato a caricare una jpg e mi ha dato ok, però non so se sia vero o meno

poi
faccio delle prove anche perche devo mettere dei controlli in più, quale la corrispondenza della descrizione col file caricato.
dimenticavo: la descrizione è obbligatoria?
 
Si, è stato caricato, infatti entrando con i login, e presente nella tabella. Per la descrizione, diciamo che non e una cosa fondamentale quanto il nome, se è un problema inserirlo, si può anche evitare.
 
Ultima modifica:
ciao
puoi provare questo, comunque provalo perchè non l'ho testato (ci possono essere erroretti, errori e erroroni...).
per comodità ho fatto una pagina unica, se vuoi farne due sostituisci i vari ..$_SERVER['PHP_SELF'].. con i nomi delle pagine.
PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Documento senza titolo</title>
</head>
<body>
<?php
require_once "config.php";//immagino che questi siano i dai di connessione comunque questo dovrebbe bastare
if(isset($_POST['go'])){
	$nome = addslashes(trim($_POST['nome']));
	$cl = addslashes(trim($_POST['cliente']));
	$da_caricare=$_FILES['nome_file']['name'];
	$desc = $_POST['desc'];//se esiste la trattiamo dopo
	$date = date("d/m/Y");
	$ok_ko="";//metto a vuoto una stringa per gli errori
	if(!is_array($da_caricare)){//verifico che sia stato caricato almeno un file
		 $ok_ko.="devi caricare almeno un file<br>";
	}else{//ci sono dei file quindi verifico che siano permessi
		$tipi_ammessi=array('jpg','gif','png','txt','pdf');// e/o altri
		$ammessi="";
		foreach($_FILES['nome_file']['name'] as $valore){
			$estenzione=pathinfo($valore, PATHINFO_EXTENSION);
			if(!in_array($estenzione,$tipi_ammessi)){
				$ammessi.=" $valore ";
			}
		}
		if($ammessi !=""){//ci sono dei file non consentiti
			 $ok_ko.="non è consentito caricare $ammessi<br>";
		}
	}
	/*per accedere a questa parte uno deve essere loggato?
	se si perche non prelevi il nome direttamente da log e lo inserisci in automatico
	senza farlo riscrivere?
	analogo per clente
	*/
	if($nome==""){//verifico che sia stato scritto il nome (vedi comm sopra)
		$ok_ko.="non hai scritto il nome<br>";
	}
	if($cl==""){//verifico che sia stato selezionato il cliente
		$ok_ko.="non hai selezionato il cliente<br>";
	}
	if($ok_ko !=""){//ci sono stati degli errori
		//quindi avvisi e torni al form ripulito
		echo $ok_ko;
		echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>";
		//puoi aumentare o diminuire il tempo di attesa es. ...content='3;...
	}else{//non ci sono errori
		//per prima carico i file
		$cartella="doc/";//se devi caricare in una cartella specifica
		foreach($_FILES['nome_file']['name'] as $chiave => $valore){
			//uso sempre nel nome del file caricato la chiave per mantenere la corrispondensa con l'eventuale descrizione
			$file_da_caricare[$chiave]=$cartella.$_FILES['nome_file']['name'][$chiave];
			$file_temporaneo=$_FILES['nome_file']['tmp_name'][$chiave];
			if(move_uploaded_file($file_temporaneo,$file_da_caricare[$chiave])){
        		echo "$file_da_caricare file caricato <br>";
			}
		}
		//e riempio la tabella
		require_once "config.php";//immagino che questi siano i dai di connessione (prova a commentarolo)
		foreach($file_da_caricare as $ch => $val){
			
			$sql = "INSERT INTO doc (id, nome, descizione, data, file) VALUES ('$cl','$nome','".$desc[$ch]."','$date','$val')";
			$res = mysql_query($sql);
		}
		/*
		e qui tutto l'ambaradan per l'invio dell'email
		*/
	}
}
?>
<form name="upload" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data">
<table width="100%"  border="0" cellspacing="0" cellpadding="2">
    <tr>
    <td width="2%">&nbsp;</td>
    <td width="16%">nome</td>
    <td width="26%"><input name="nome" type="text"></td>
    <td width="10%">&nbsp;</td>
    <td width="8%">&nbsp;</td>
    <td width="38%">&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>selezione cliente</td>
    <td><select name="cliente">
<?php
$ric = mysql_query("SELECT id, nome, cognome FROM clienti ");
while ($row = mysql_fetch_assoc($ric)) {  
	echo "<option value=" . $row['id'] . ">" . $row['nome']. "&nbsp;" . $row['cognome'] . "</option>";//????  
}  
?>
	</select>
	</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td colspan="6">devi caricare almeno un file</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>descrizione del file</td>
    <td>seleziona file</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
<?php
$max_file=3;//in queso modo se vuoi aumentare o diminuire lo fai con facilità
for($k=1;$k <=$max_file; $k++){
echo <<<CARICA
  <tr>
    <td>$k</td>
    <td>&nbsp;</td>
    <td><input name="desc[$k]" type="text"></td>
    <td><input name="nome_file[$k]" type="file" id="nome_file" size="40"></td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
CARICA;
}
?>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td><input type="submit" name="go" value="Carica"></td>
  </tr>
</table>
</form>
</body>
</html>
prova e sappimi dire
 
Ciao, ho provato, ma mi da un errore alla riga 112, che sarebbe questa
PHP:
echo <<<CARICA
Cosi, ho sostituito con gli apici singoli, l'errore non viene fuori, ma provando lo script carica solo l'ultimo dei 3 file, inoltre non viene stampata il contenuto della variabile $k. Per semplificare ti riposto il codice con i commenti alle tue domande (i miei sono con #...).

PHP:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
<title>Documento senza titolo</title> 
</head> 
<body> 
<?php 
require_once "config.php";//immagino che questi siano i dai di connessione comunque questo dovrebbe bastare
# Si e il file dove ci sono i dati del db con relativa connessione.
if(isset($_POST['go'])){ 
    $nome = addslashes(trim($_POST['nome'])); 
    $cl = addslashes(trim($_POST['cliente'])); 
    $da_caricare=$_FILES['nome_file']['name']; 
    $desc = $_POST['desc'];//se esiste la trattiamo dopo # ok
    $date = date("d/m/Y"); 
    $ok_ko="";//metto a vuoto una stringa per gli errori 
    if(!is_array($da_caricare)){//verifico che sia stato caricato almeno un file 
         $ok_ko.="devi caricare almeno un file<br>"; 
    }else{//ci sono dei file quindi verifico che siano permessi 
        $tipi_ammessi=array('jpg','gif','png','txt','pdf');// e/o altri 
        $ammessi=""; 
        foreach($_FILES['nome_file']['name'] as $valore){ 
            $estenzione=pathinfo($valore, PATHINFO_EXTENSION); 
            if(!in_array($estenzione,$tipi_ammessi)){ 
                $ammessi.=" $valore "; 
            } 
        } 
        if($ammessi !=""){//ci sono dei file non consentiti 
             $ok_ko.="non è consentito caricare $ammessi<br>"; 
        } 
    } 
    /*per accedere a questa parte uno deve essere loggato? 
    se si perche non prelevi il nome direttamente da log e lo inserisci in automatico 
    senza farlo riscrivere? 
    analogo per clente 
    */ 
	# Il caricamento verrà effettuato si tramite un pagina loggata, ma sara solo l'amministratore
    # del sito o lo staff a caricare contenuti.
	# Gli utenti normali potranno solo scaricare i file gia presenti sul sito,
	# Nella loro area privata.
	
	
    if($nome==""){//verifico che sia stato scritto il nome (vedi comm sopra) 
        $ok_ko.="non hai scritto il nome<br>"; 
    } 
    if($cl==""){//verifico che sia stato selezionato il cliente 
        $ok_ko.="non hai selezionato il cliente<br>"; 
    } 
    if($ok_ko !=""){//ci sono stati degli errori 
        //quindi avvisi e torni al form ripulito 
        echo $ok_ko; 
        echo "<meta http-equiv='Refresh' content='4; URL=".htmlspecialchars($_SERVER['PHP_SELF'])."'>"; 
        //puoi aumentare o diminuire il tempo di attesa es. ...content='3;...   #ok
    }else{//non ci sono errori 
        //per prima carico i file 
        $cartella="doc/";//se devi caricare in una cartella specifica 
        foreach($_FILES['nome_file']['name'] as $chiave => $valore){ 
            //uso sempre nel nome del file caricato la chiave per mantenere la corrispondensa con l'eventuale descrizione 
            $file_da_caricare[$chiave]=$cartella.$_FILES['nome_file']['name'][$chiave]; 
            $file_temporaneo=$_FILES['nome_file']['tmp_name'][$chiave]; 
            if(move_uploaded_file($file_temporaneo,$file_da_caricare[$chiave])){ 
                echo "$file_da_caricare file caricato <br>"; 
            } 
        } 
        //e riempio la tabella 
        require_once "config.php";//immagino che questi siano i dai di connessione (prova a commentarolo) # esatto dati del db e relativa connessione
        foreach($file_da_caricare as $ch => $val){ 
             
            $sql = "INSERT INTO doc (id, nome, descizione, data, file) VALUES ('$cl','$nome','".$desc[$ch]."','$date','$val')"; 
            $res = mysql_query($sql); 
        } 
        /* 
        e qui tutto l'ambaradan per l'invio dell'email 
        */ 
    } 
} 
?> 
<form name="upload" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data"> 
<table width="100%"  border="0" cellspacing="0" cellpadding="2"> 
    <tr> 
    <td width="2%">&nbsp;</td> 
    <td width="16%">nome</td> 
    <td width="26%"><input name="nome" type="text"></td> 
    <td width="10%">&nbsp;</td> 
    <td width="8%">&nbsp;</td> 
    <td width="38%">&nbsp;</td> 
  </tr> 
  <tr> 
    <td>&nbsp;</td> 
    <td>selezione cliente</td> 
    <td><select name="cliente"> 
<?php 
$ric = mysql_query("SELECT id, nome, cognome FROM clienti "); 
while ($row = mysql_fetch_assoc($ric)) {   
    echo "<option value=" . $row['id'] . ">" . $row['nome']. "&nbsp;" . $row['cognome'] . "</option>";//????  # estraggo dal db tutti i clienti con nome, cognome e id
	                             # in mo che quando devono caricare un file, gli basta selezionare i cliene dal menu a tendina, che si popolerà in automatico, quando
								 # verrà registrato un nuovo cliente.  
	}   
?> 
    </select> 
    </td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
  </tr> 
  <tr> 
    <td colspan="6">devi caricare almeno un file</td> 
  </tr> 
  <tr> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td>descrizione del file</td> 
    <td>seleziona file</td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
  </tr> 
<?php 
$max_file=3;//in queso modo se vuoi aumentare o diminuire lo fai con facilità 
for($k=1;$k <=$max_file; $k++){ 
# qui c'è qualche errore, e ancora non sono riuscito a capire.... Hai voluto utilizzare stringa Heredoc per un motivo particolare, o solo per comodità?
echo '   
  <tr> 
    <td>$k</td> 
    <td>&nbsp;</td> 
    <td><input name="desc[$k]" type="text"></td> 
    <td><input name="nome_file[$k]" type="file" id="nome_file" size="40"></td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
  </tr>';

} 

?> 
  <tr> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td>&nbsp;</td> 
    <td><input type="submit" name="go" value="Carica"></td> 
  </tr> 
</table> 
</form> 
</body> 
</html>

Ho caricato lo script Qui, puoi dargli un occhiata se vuoi.


Grazie.
 
ciao
ho usato l'eredoc perche è più comodo, cpmimque va bene anche la sintassi normale, ma NON con gli apici sincoli (nota che ti stampa $k e non il suo valore)
eventualmente usa i doppi apici e lo slash dove serve.
a domani
 
Ultima modifica:

Discussioni simili