• User

    [Tutorial] Come caricare un immagine su database mysql

    Salve a tutti. Apro questa discussione perchè spero di trovare delle risposte chiare alle seguenti domande.
    Vorrei caricare delle immagini su un database mysql attraverso un form. Mi spiego meglio, Voglio che gli utenti possano caricare dinamicamente sul sito delle immagini presenti sul proprio computer, attraverso un form con il campo carica file. Come succede nei social network.
    Vi dò altre informazioni utili: Il linguaggio dinamico di programmazione è il Php, il database è il Mysql.
    Qualcuno può aiutarmi, può spiegarmi in maniera semplice come posso fare. Aspeto risposte.
    Cordiali saluti


  • User Attivo

    Prima di tutto bisogna creare una tabella che permetta il salvataggio di file, lo facciamo utilizzando un campo di tipo BLOB.

    
    CREATE TABLE tabella_file
    (
       id INT (10) NOT NULL auto_increment,
       nome VARCHAR (255) default NULL,
       tipo VARCHAR (128) default NULL,
       dati BLOB,
       PRIMARY KEY  (id)
    )
    
    ```Poi creiamo un file **upload.htm** dove mettere il form per l'upload.
    
    [html]
    <html>
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
    <title>Carica file nel DB</title> 
    </head>
    <body>
    <p>Seleziona un file da memorizzare nel database:</p> 
    <form name="upload" enctype="multipart/form-data" method="post" action="write_db.php"> 
    <p>
    <input type="file" name="file_inviato"><br>
    <input type="submit" name="invia" value="Invia file">
    </p> 
    </form>
    </body>
    </html>
    [/html]Adesso creiamo una funzione per scrivere l'immagine caricata dal form sul database.
    Per questo creiamo un file **write_db.php**
    
    [php]
    // Verifico eventuali problemi nell'upload del file
    if((!isset($_FILES["file_inviato"])) || ($_FILES["file_inviato"]["error"] != UPLOAD_ERR_OK))
       echo "Errore nell'invio del file. Riprova!");
    
    // Connessione e selezione del database
    mysql_connect("localhost", "root", "password")
    or die("Connessione non riuscita: " . mysql_error());
    
    if(!mysql_select_db("mio_db"))
    die("Selezione database fallita!");
    
    // Recupero delle 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 sql
    $dati_file = addslashes($dati_file);
    
    // Query per inserire il file nel DB
    $query = "INSERT INTO tabella_file SET
                  nome = '$nome_file_vero', 
                  tipo = '$tipo_file', 
                  dati = '$dati_file'"; 
    
    mysql_query($query)
    or die("Query non valida: " . mysql_error());
    
    // Messaggio di successo
    echo "Memorizzazione del file <b>$nome_file_vero</b> nel database eseguita correttamente!");
    [/php]Adesso il file è caricato all'interno del database sotto forma di stringa.
    Per recuperare la stringa, creiamo un file di nome **view.php** che elenca tutti i file contenuti nella tabella.
    
    [php]
    // Connessione e selezione del database
    mysql_connect("localhost", "root", "password")
    or die("Connessione non riuscita: " . mysql_error());
    
    if(!mysql_select_db("mio_db"))
    die("Selezione database fallita!");
    
    // Query per ottenere l'elenco dei files
    $query = "SELECT * FROM tabella_file";
    
    $risultato = mysql_query($query)
    or die("Query non valida: " . mysql_error());
    
    // Se ci sono file nel DB
    if(mysql_numrows($risultato))
    {
        // Estrazione dei risultati e stampa dei links
        while ($tmp = mysql_fetch_array($risultato))
        {
            echo "<p><a href=\"open.php?id=$tmp[id]\">$tmp[nome]</a></p>\n";
        }
    }
    else
    {
        echo "<p>Nessun file presente nel database</p>";
    }
    [/php]Per visualizzare il contenuto del file, creiamo il file **open.php**
    
    [php]
    if($_GET['id'] == "")
        header("Location: view.php");
    
    // Connessione e selezione del database
    mysql_connect("localhost", "root", "password")
    or die("Connessione non riuscita: " . mysql_error());
    
    if(!mysql_select_db("my_db"))
    die("Selezione database fallita!");
    
    // Query per recuperare il file
    $query = "SELECT * FROM tabella_files WHERE id_file = " . $_GET["id"];
    $risultato = mysql_query($query)
    or die("Query non valida: " . mysql_error());
    $tmp = mysql_fetch_array($risultato);
    
    // Invio l'intestazione contenente il tipo MIME del file
    header("Content-Type: " . $tmp["tipo"]);
    
    // Invio il contenuto del file
    echo $tmp["dati"];
    [/php]In questo modo puoi salvare e recuperare file su di un database sql.
    
    Ciao!

  • User

    :perfavore:

    ...ditemi se non è da linkare tra i threads ****utili...

    ...grande Sups!


  • User Newbie

    errore scusate


  • User Newbie

    Ottima guida, complimenti!

    Avrei però una domanda...avrei bisogno di inserire nel database oltre all'immagine una descrizione della stessa...è possibile farlo?

    Altra domanda...

    Come faccio a salvare anche l'immagine vera e propria? Io avrei bisogno di salvarla in una cartella del mio sito perchè poi devo andare a stamparle in una sorta di galleria...

    Praticamente mi servirebbe che, tramite un ciclo, si potesse leggere il contenuto del database e poi scrivere l'immagine in una pagina...

    Come posso fare?


  • User Newbie

    Ottimo tutorial, molto utile!
    Ma se invece dei link testuali che aprono le immagini vorremmo far comparire delle miniature?
    E' possibile?


  • User Attivo

    Ciao,
    per studio ho modificato un po il codice inserendo nella tabella anche l'id di chi ha inserito l'immagine.
    Ora il problema è : come faccio a far stampare solo la foto di quel determinato utente ?


  • User Attivo

    Non conosco come hai modificato la tabella, ma supponendo che hai inserito un'ipotetica colonna user tipo varchar puoi usare questa query:

    SELECT * FROM tabella_file WHERE user = 'nomeutente';

    di conseguenza:

    SELECT * FROM tabella_files WHERE user = 'nomeutente' AND id_file = " . $_GET["id"];

    Ciao!


  • User Attivo

    Si Grazie mi ero confuso con le immagini


  • User

    Ma io sono l'unico a cui non funziona questo script?


  • User Newbie

    Ciao Sups,

    ho provato il tuo script e pare funzionare nella sua prima parte di inserimento e listing delle foto;

    nella tabella sul DB tabella_file pare tutto ok.

    ho un problema però il file open.php quando cerco di visualizzare la foto che ho precedentemente caricato:

    mi restituisce il codice html:

    <img src="h**p://localhost/open.php?id=2" alt="h**p://localhost/open.php?id=2">
    ``` ma nn mi visualizza l'immagine, solo l'alt...
    
    qualche idea?
    
    Grazie mille, un salutone!

  • User Attivo

    Ragazzi sapreste dirmi anche come ridimensionare le immagini che si trovano gia salvate sul database ?


  • Consiglio Direttivo

    Recuperandoti l'immagine potresti provare ad utilizzare questo utilissimo script di Sovietiko. 😉


  • User Newbie

    buon giorno/sera, non capisco il motivo ma Dreamweaver mi evidenzia 2 problemi nella sintassi dei comandi "echo" nel file write_db.php.
    ho solamente racchiuso il testo tra <?php e ?>..qualcuno potrebbe cortesemente aiutarmi?grazie:)


  • User Newbie

    risolto...


  • User Attivo

    Salve a tutti, m'intrufolo nella discussione, anche se è un po' vecchiota. Ma spero in un anima pia che mi possa aiutare. Il punto è questo. Dovrei costruire un form che mi permetta di caricare le immagini e creare un album con la possibilità di dargli un nome e senza limiti di dimensioni, . Dopo di che, tale immagine si dovrebbe memorizzare in un db (ovviamente so che non conviene memorizzare l'immagine intera, ma solo il link). Poi, una volta fatto ciò, dovrebbe comparire come fa fb ossia nelle thumberlin (mi sembra che si chiamino). Mi potete dare una mano per favore ???? Non so da che parte iniziare e non ho nessun codice da poter postare. perchè sono tutti sballati. E non fannno quello che vorrei che facessero. Grazie. Ah un ultima cosa, possibilmete avere la possibilità di selezionare le immagini più di una alla volta. Considerate anche che alcune immagini, provengono dallo scanner e con le estensioni più diffuse e utilizzate. Grazie so di chiedere la luna, ma spero in un vostro aiuto.


  • User Attivo

    Salve,
    ho eseguito il tutorial con le opportune modifiche alla password e al nome del db utilizzato ma ho evidenziato errori alle righe 4 e 34 per l'inserimento di una ")" prima di ;
    Lo script funziona ma write_db non salva l'immagine nella root e nemmeno il suo percorso nel campo "dati" del db mentre tutti gli altri dati vengono inseriti.


  • User Attivo

    @antoniog2 said:

    Salve,
    ho eseguito il tutorial con le opportune modifiche alla password e al nome del db utilizzato ma ho evidenziato errori alle righe 4 e 34 per l'inserimento di una ")" prima di ;
    Lo script funziona ma write_db non salva l'immagine nella root e nemmeno il suo percorso nel campo "dati" del db mentre tutti gli altri dati vengono inseriti.

    Ciao antoniog2,

    Eri rivolto a me ??? Nella risposta ???? Se si, a me funziona perfettamente. Ma se vuoi ti mandao il tutto ricorretto. Ah una cosa, hai skype per caso ??? Fammi sapere ok ??? Al limite il mio contatto skype è il seguente: mousesenzapalle2007 (valido anche per chi mi volesse aiutare), grazie.


  • User Newbie

    salve
    sul file open.php mi dice: Query non valida: Table 'my_db.tabella_files' doesn't exist ...perche'? quale potrebbe essere l'errore


  • User Attivo

    Si intendevo rispondere a te paperinik4.