Visualizzazione risultati 1 fino 10 di 10

Discussione: [php]upload immagini e mysql

  1. #1
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito [php]upload immagini e mysql

    Ciao
    Ho questo semplice script con il quale inserisco i dati
    in una tabella di un database mysql opportunamente creata con i campi di cui nello script sotto:

    Codice PHP:
    <?php

    include("dati.php");
    $link=mysql_connect("$db_host","$db_login","$db_pass")
    or die (
    "Non riesco a connettermi a <b>$db_host");

    @
    mysql_select_db ($database, $link)
    or die (
    "Non riesco a selezionare il db $database<br>");

    if (isset(
    $_REQUEST['nome'])){
    $dati=" INSERT INTO rubrica VALUES (NULL,
    '"
    .$_REQUEST['nome']."',
    '"
    .$_REQUEST['cognome']."',
    '"
    .$_REQUEST['reparto']."',
    '"
    .$_REQUEST['stipendio']."'
    )"
    ;

    mysql_query ($dati, $link)
    or die (
    "Non riesco ad eseguire la query $dati");
    Echo
    "I Dati sono stati archiviati con successo nel DataBase $database";
    mysql_close ($link);
    echo
    "<meta http-equiv=refresh content=3;url=$PATH_INFO>";
    }
    ?>
    <html>
    <head>
    <title>Form dati</title>
    </head>
    <body>
    <TABLE border=0 width=100% cellpadding=3>
    <tr>
    <td width=100% colspan=2>
    <p align=center><b>Inserisci i dati del nuovo utente
    <form method=POST action=<? $PATH_INFO ?>>
    </b></td>
    </tr>
    <tr>
    <td width=18%><b>Nome</b></td>
    <td width=82%><input type=text name=nome size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Cognome</b></td>
    <td width=82%><input type=text name=cognome size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Reparto</b></td>
    <td width=82%><input type=text name=reparto size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Stipendio</b></td>
    <td width=82%><input type=text name=stipendio size=20></td>
    </tr>

    <tr>
    <td width=18%><b><input type=submit value=Inserisci nuovi dati></b></td>
    <td width=82%></form></td>
    </tr>
    </table>
    </body>
    </html>
    Adesso vorrei implementare il codice inserendo la possibilità di
    caricare anche un'immagine relativa ad ogni nome (e quindi ID) e dovrei
    aggiungere un modulo dal quale
    scegliere e caricare l'immagine.
    Penso di dover anche inserire un nuovo campo , per il nome dell'immagine, nella tabella del database
    che chiamo "foto".
    Tutte le immagini dovrebbero essere "uploadate" in una cartella sul server che chiamo images.

    ok, allora:

    inserisco un nuovo campo nel form html sopra

    Codice:
    <td width=82%><input type=file name=foto size=20></td>
    tra i request che ricevono il contenuto del form aggiungo:

    Codice PHP:
    '".$_REQUEST['foto']."'
    Ho letto in giro che bisogna aggiungere al codice html del form questo:

    Codice:
    enctype=multipart/form-data
    Non ho capito precisamente dove comunque.

    Potreste suggerirmi il codice per caricare l'immagine nella cartella "images" del server e
    che eviti anche di caricare immagini superiore ad un limite da me indicato?

    Il campo del database mysql "foto" dovrebbe ricevere solo il nome della foto in quanto penso
    di richiamare e visualizzare la foto una volta caricata nella cartella con cosa del tipo:

    Codice PHP:
    echo "<tr><td align='right'><img src=images/".mysql_result($query,0,"foto")."></td></tr>";
    Non so se è del tutto indicato ma fatto sta che inserendo "manualmente" il nome dell'immagine
    nel DB il codice sopra funziona.

    Ho provato e riprovato a scrivere il codice con la nuova funzionalità ma ho
    avuto un sacco di problemi (è da molto tempo che non scrivo in php).

    Potete quindi aiutarmi a ricostruire il codice php dell'intera pagina?


    Grazie anticipatamente.

  2. #2
    Guest

  3. #3
    Guest

    Predefinito

    Quando presentai un po' di tempo fà uno script su questo forum per l'upload di file (nel file system), un utente mi fece notare che non era sicuro e lo modificai immediatamente.
    Mi fa piacere che a distanza di tempo html.it mostri un tutorial ancora meno sicuro

    Comunque il tutorial che avevo fatto (e modificato) sta qua: http://golfox.altervista.org/tutorials/upload_fs.php
    Siccorme sto rifacendo il sito, funzioneranno solo pochi link ma almeno quello che serve c'è

    La cosa che ti consiglio di modificare è questa parte (che "funziona" ma non è una bella soluzione):
    Codice PHP:
    if ($file_size <= 10240 && substr($file_name, -3) != 'php' && substr($file_name, -3) != 'bin' && substr($file_name, -3) != '.sh' && substr($file_name, -3) != 'exe' && substr($file_name, -3) != '.js' && substr($file_name, -4) != 'php3'){ ## ## se l'attach è al max 10 kbyte faccio l'upload
    Nel tuo caso, dato che devi caricare solo delle immagini, ti consifglierei di sfruttare le informazioni che ti vengono date dal mime-type quando viene caricato il file ($_FILES['file']['type']).
    Comunque tutti i riferimenti li trovi qui:
    http://it2.php.net/manual/it/features.file-upload.php

    Ciao

    P.S. quando continuerò le modifiche al sito, molto probabilmente cambierà l'URL

  4. #4
    Guest

    Predefinito

    Al posto di
    Codice PHP:
    substr($file_name, -3) != 'php'
    è meglio usare
    Codice PHP:
    !stristr($file_nanme, 'php')
    perché se uno invia un file chiamato "file.php.estensionefinta" viene eseguito comunque.

  5. #5
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    mh, vediamo cosa riesco a fare e magari ci risentiamo.

    Grazie a tutti per l'intervento.
    Ciao

  6. #6
    Guest

    Predefinito

    Citazione Originalmente inviato da tuttoeniente2
    Al posto di
    Codice PHP:
    substr($file_name, -3) != 'php'
    è meglio usare
    Codice PHP:
    !stristr($file_nanme, 'php')
    perché se uno invia un file chiamato "file.php.estensionefinta" viene eseguito comunque.
    Quindi secondo te "file.php.estensionefinta" viene interpretato dal server come un file php? Se si, in che modo? A me non risulta che un file tipo mailto.php.txt venga interpretato, forse mi sfugge qualcosa?

    Comunque la tua soluzione è sicuramente più pulita della mia anche se avevo in mente ancora un'altra soluzione.

    Ciao
    Ultima modifica di golfox : 27-09-2006 alle ore 08.49.48

  7. #7
    Guest

    Predefinito

    I .txt no, perché sono un formato standard, estensioni che non esistono vengono eseguite.
    Guarda: http://tuttoeniente2.altervista.org/...ltraestensione
    http://tuttoeniente2.altervista.org/...nsione.php.txt

    Questo è il codice:
    Codice PHP:
    <?php
    echo "Hello World!<br>Il tuo IP &egrave;: ".$_SERVER['REMOTE_ADDR'];
    ?>

  8. #8
    Guest

    Predefinito

    Citazione Originalmente inviato da tuttoeniente2
    I .txt no, perché sono un formato standard, estensioni che non esistono vengono eseguite.
    Guarda: http://tuttoeniente2.altervista.org/...ltraestensione
    http://tuttoeniente2.altervista.org/...nsione.php.txt
    Simpatico, non ci avevo mai provato.... vado a cambiare il codice che è meglio

    Ciao e grazie

  9. #9
    gianlucaweb non è connesso Utente attivo
    Data registrazione
    01-01-2003
    Messaggi
    470

    Predefinito

    Citazione Originalmente inviato da golfox
    Simpatico, non ci avevo mai provato.... vado a cambiare il codice che è meglio

    Ciao e grazie
    Adesso sembra funzionare, il nome del file viene caricato nel campo del DB
    e il file stesso è uploadato nella cartella images del server.
    Ho fatto così:

    Codice PHP:

    <?php

    include("dati.php");
    $link=mysql_connect("$db_host","$db_login","$db_pass")
    or die (
    "Non riesco a connettermi a <b>$db_host");

    @
    mysql_select_db ($database, $link)
    or die (
    "Non riesco a selezionare il db $database<br>");

    if (isset(
    $_REQUEST['nome'])){
    $dati=" INSERT INTO rubrica VALUES (NULL,
    '"
    .$_REQUEST['nome']."',
    '"
    .$_REQUEST['cognome']."',
    '"
    .$_REQUEST['reparto']."',
    '"
    .$_REQUEST['stipendio']."',
    '"
    .$_FILES['foto']['name']."'
    )"
    ;


    mysql_query ($dati, $link)
    or die (
    "Non riesco ad eseguire la query $dati");
    Echo
    "I Dati sono stati archiviati con successo nel DataBase $database";
    mysql_close ($link);
    echo
    "<meta http-equiv=refresh content=3;url=$PATH_INFO>";
    }
    ?>

    <?php
    // Nelle versioni di PHP precedenti alla 4.1.0 si deve utilizzare $HTTP_POST_FILES anzichè
    // $_FILES.
    $uploaddir = 'images/';
    $uploadfile = $uploaddir . basename($_FILES['foto']['name']);
    echo
    "<pre>";
    if (
    move_uploaded_file($_FILES['foto']['tmp_name'], $uploadfile)) {
    echo
    "File is valid, and was successfully uploaded.\n";
    } else {
    echo
    "Possibile attacco tramite file upload!\n";
    }
    echo
    'Alcune infromazioni di debug:';
    print_r($_FILES);

    print
    "</pre>";

    ?>
    <html>
    <head>
    <title>Form dati</title>
    </head>
    <body>
    <TABLE border=0 width=100% cellpadding=3>
    <tr>
    <td width=100% colspan=2>
    <p align=center><b>Inserisci i dati del nuovo utente
    <form method="POST" enctype="multipart/form-data" action=<? $PATH_INFO ?>>
    </b></td>
    </tr>
    <tr>
    <td width=18%><b>Nome</b></td>
    <td width=82%><input type=text name=nome size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Cognome</b></td>
    <td width=82%><input type=text name=cognome size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Reparto</b></td>
    <td width=82%><input type=text name=reparto size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Stipendio</b></td>
    <td width=82%><input type=text name=stipendio size=20></td>
    </tr>
    <tr>
    <td width=18%><b>Foto</b></td>
    <td width=82%><input type=file name=foto size=20></td>
    </tr>
    <tr>
    <td width=18%><b><input type=submit value=Inserisci nuovi dati></b></td>
    <td width=82%></form></td>
    </tr>
    </table>
    </body>
    </html>

    Sinceramente il codice suggerito da Golfox e Tuttoeniente2 non l'ho
    capito. A cosa serve? Potete spiegarmelo precisamente, per piacere?
    Dove e come lo integro al mio?

    Vorrei adesso, aggiungere qualcosa al mio codice sopra, perfezionarlo:

    evitare di uploadare file di grosse dimensioni, renderlo sicuro ecc ecc.

    Cosa mi suggerite?

    Come si fa poi a ridimensionare le immagini a una risoluzione standard
    per tutte (ovviamente relativamente alla pagina che richiama i dati)

    Grazie ancora

  10. #10
    Guest

    Predefinito

    Citazione Originalmente inviato da gianlucaweb
    ....
    Sinceramente il codice suggerito da Golfox e Tuttoeniente2 non l'ho
    capito. A cosa serve?
    Serve a non permettere ai "maleintenzionati" di fare del tuo spazio web quello che vogliono.
    Citazione Originalmente inviato da gianlucaweb
    Potete spiegarmelo precisamente, per piacere?
    Premesso che non so dove utilizzi quello script, comunque come hai impostato tu l'upload, permetti di caricare qualunque file di qualsiasi dimensione della tua directory images/.
    Quindi a qualcuno potrebbe venire in mente di caricare un file php (per esempio) e di metterci tante funzioncine simpatiche come ad esempio
    opendir
    readdir
    per vedere quello che c'è e poi passare a cancellare tutto (tranne il proprio simpatico script e quello che gli ha permesso di fare l'upload, cioè il tuo) con unlink e rmdir.
    Il controllo che ho messo e che Tuttoeniente2 ha migliorato, cerca di eliminare questo problema.
    Non solo: sempre in quell'if non si permette di caricare files più grossi di un tot
    Codice PHP:
    $_FILES['file']['size'] <= 10240
    Citazione Originalmente inviato da gianlucaweb
    Dove e come lo integro al mio?
    Dove fai l'upload
    Citazione Originalmente inviato da gianlucaweb
    Come si fa poi a ridimensionare le immagini a una risoluzione standard
    per tutte (ovviamente relativamente alla pagina che richiama i dati)
    Prova con le funzioni della libreria GD

    Ciao e buon lavoro

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •