Files ed immagini in MySQL

Upload e inserimento in MySQL

Il seguente script si occupa di inserire all'interno della tabella appena creata un file inviato dall'utente attraverso un form. Il principio di funzionamento è abbastanza semplice: la prima volta che viene eseguito lo script, viene chiamata la funzione mostra_form che si occupa di preparare il modulo per l'upload del file. All'invio del file si procede con il recupero del suo contenuto e con l'inserimento nel database.

Non ci soffermiamo sui dettagli della procedura di upload del file, che non rientra nello scopo di questo articolo. Si noti solamente come sia possibile ricavare dall'array $_FILES alcune informazioni sul file ricevuto, in particolare il suo tipo MIME. Si tratta di una stringa che lo stesso browser invia insieme al file e che ne specifica il tipo. A esempio per una immagine in formato GIF questa stringa sarà "image/gif". Per un elenco dei diversi tipi MIME è possibile consultare questa pagina.

 

<?php 
// se è stato inviato il file...
if(isset($_POST['invia']))
{
	// se ci sono stati problemi nell'upload del file
	if(!isset($_FILES['file_inviato']) OR $_FILES['file_inviato']['error'] != UPLOAD_ERR_OK)
	mostra_form("errore nell'invio del file. Riprova");

	// connessione e selezione del database
	mysql_connect('localhost', 'utente_db', 'password_db')
	or die('Connessione non riuscita: ' . mysql_error());

	if(!mysql_select_db('nome_database'))
	die('Selezione database fallita!');

	// recupero alcune informazioni sul file inviato
	$nome_file_temporaneo = $_FILES['file_inviato']['tmp_name'];
	$nome_file_vero = $_FILES['file_inviato']['name'];
	$tipo_file = $_FILES['file_inviato']['type'];

	// leggo il contenuto del file
	$dati_file = file_get_contents($nome_file_temporaneo);

	// preparo il contenuto del file per la query
	$dati_file = addslashes($dati_file);

	// query per inserire il file nel DB
	$query = "INSERT INTO tabella_files SET
				nome_file = '$nome_file_vero', 
				tipo_file = '$tipo_file', 
				dati_file = '$dati_file'"; 

	mysql_query($query)
	OR die('Query non valida: ' . mysql_error());

	// mostro nuovamente il form ed un messaggio di successo
	mostra_form("Memorizzazione del file <b>$nome_file_vero</b> nel database eseguita correttamente.");
}
else
{
	mostra_form();
}

/**
* Mostra il form per l'upload del file 
* 
*/ 
function mostra_form($messaggio = '')
{
	?> 
	 
	<head> 
	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
	<title>Carica file nel database</title> 
	</head> 
	 
	<p><?php echo $messaggio?> <br /> Seleziona un file da memorizzare nel database: <p></p> 
	<form name="form1" enctype="multipart/form-data" method="post" action=""> 
	<p> 
	<input type="file" name="file_inviato"> 
	<p></p> 
	<p> 
	<input type="submit" name="invia" value="Invia file"> 
	<p></p> 
	</form> 
	 
	 
	<?php 
	exit();
}
?>

Questo script non necessita di molti commenti, già presenti all'interno del codice. Si noti come l'inserimento di un file in MySQL si effettua attraverso una comune query INSERT.

 

13 commenti

1 paolo paolo mercoledì 28 luglio 2010, ore 00:38
Complimenti per lo script!
L' unica cosa che mi da errore nella riga 15 nella pagina mostra.php

header('Content-Type: '.$tmp['tipo_file']);

Carico dei jpg e quando vado a cliccare sul link per visualizzare l' immagine mi escono tutti dei simboli strani , segno che non ha codificato l' immagine jpg. come posso fare per risolvere il problema? grazie
2 andrea andrea martedì 21 settembre 2010, ore 09:37
io ho lo stesso problema... hai risolto? se si come?
grazie mille

Andrea
3 Gianni Tomasicchio Gianni Tomasicchio martedì 21 settembre 2010, ore 10:09
Verificate l'inserimento accidentale di spazi o "a capo" in testa o in coda agli script.
4 massimiliano massimiliano giovedì 28 ottobre 2010, ore 09:18
diciamo semplicemente che dopo averlo modificato coni parametri di connesisone miei personali 1no inserisce alcun file nel data base e 2 i file come gia detto da altri utenti non vieve visualizzato con immagini ma simboli ^_^.
5 Fabio Fabio venerdì 11 febbraio 2011, ore 19:58
Stesso problema.
C'è una soluzione?
Grazie
6 Gianni Tomasicchio Gianni Tomasicchio venerdì 11 febbraio 2011, ore 20:23
Per qualsiasi problema riscontrato con gli script dell'articolo potete scrivere nel nostro forum.
7 davide davide giovedì 24 marzo 2011, ore 00:00
Ciao ho fatto esattamente quello che hai detto ma non mi salva il file sicuramente per il blob..può essere qualche impostazione?
8 Gianni Tomasicchio Gianni Tomasicchio giovedì 24 marzo 2011, ore 08:53
Ricevi qualche messaggio di errore?
9 alykiss alykiss mercoledì 13 aprile 2011, ore 17:42
ciao

due richieste in un giorno forse sono troppe:-)

veniamo a questo codice, intanto lo uso con wordpress, quindi ho dovuto cambiare qualcosa, ovviamente sono andato per intuito visto che di php non capisco un'H, ho eliminato queste due righe
// connessione e selezione del database
mysql_connect('localhost', 'utente_db', 'password_db')
or die('Connessione non riuscita: ' . mysql_error());

if(!mysql_select_db('nome_database'))
die('Selezione database fallita!');

connessione al database la fa wordpress
ho creato il db
ho inserito un'immagine .bmp
quando la richiamo però mi da questo errore:
Query non valida: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1.

nella linea 1 non c'è niente, quindi non capisco

aspetto notizie con impazienza grazie :-)
10 seingh seingh giovedì 21 aprile 2011, ore 11:37
Gli header vanno in cima al codice, perciò l'errore può essere quello.
11 lollo89 lollo89 sabato 7 maggio 2011, ore 16:38
Salve, invece di far stampare l'immagine in una pagina unica, e possibile far stampare l'immagine da una tag IMG.
Grazie
12 Gianni Tomasicchio Gianni Tomasicchio domenica 8 maggio 2011, ore 08:16
Si, basta impostare l'url del tag img in modo che punti allo script mostra.php:

<img src="mostra.php?id=123" />
13 tia96 tia96 martedì 19 luglio 2011, ore 10:14
Le immagini non mele visualizza complete, ma solo a metà, come risolvo?
Effettua l'accesso o registrati per inserire un commento