Come spedire e salvare le foto, i filmeti, i file dal pc utente al portale internet con il linguaggio di programmazione PHP.
ALLWEB free
Web Directory Script Linguaggi
Italiano Inglese Tutte
 
 29 Jul 2010
rss directory aggiungi in preferiti  
Home    Mappa directory    Giochi    XXXDirectory    Script    Forum




Codice script - per salvare i file dal pc utente con php:

questo articolo si sviluppa in tre pagine:
In questa pagina analizzeremo il codice dello script e le tabelle mysql correlate.


Tabella database:

Per prima cosa create una tabella nel vostro database utilizzando la seguente query:
CREATE TABLE `foto` (
`id` int(11) NOT NULL auto_increment,
`nomefoto` varchar(100) NOT NULL default '',
`ipfoto` varchar(100) NOT NULL default '',
`commento` varchar(100) NOT NULL default '',
`alt` varchar(100) NOT NULL default '',
PRIMARY KEY (`id`)
)
(copiate ed incollate il codice nella sezione SQL di PhpMyAdmin)

In pratica abbiamo creato una tabella con i seguenti campi:
- ID campo numerico primario con auto_increment.
- NOMEFOTO il nome della foto(nel nostro caso il timestamp).
- IPFOTO ip del navigatore che ha inserito la foto.
- COMMENTO commento del navigatore che ha inserito la foto.
- ALT il nome originale della foto mostrato con ALT="..." nel tag IMG.


Codice script:

Dopo aver creato la tabella potrete inserire il codice php e html come nell'esempio qua sotto.
Nelle note riportate potrete leggere la spiegazione dello script. Se durante il copia incolla le note risulteranno su più righe potrete visualizzare un errore a video (accertatevi che ogni riga che inizia con // termini sulla stessa riga!!).


<?
//INIZIO SCRIPT DI SALVATAGGIO DATI (se l'utente ha attivato il form)
//recupero le variabili del form
$hfoto=$_GET['hfoto'];
$termini=$_POST['termini'];
$newfoto=$_POST['newfoto'];
$attivaform=$_POST['attivaform'];
$commento=strip_tags($_POST['commentofoto']);
//variabili del database (le conoscete SOLO VOI!!)
$database="..nome_del_vostro_database..";
$hos="localhost";
$user="..Vostro_user_database..";
$pass="..Vostra_password_database..";
$link = mysql_connect($hos,$user,$pass);//variabile di connessione database
//FINE variabili database
if($attivaform==2){//se il form è stato attivato proseguo
if($termini==2){//se il box 'termini e condizioni' è stato attivato proseguo
$grand=filesize($_FILES['newfoto']['tmp_name']);//Controllo la grandezza della foto
if($grand<=1000){//Se la foto è minore di 1000 byte proseguo. Dato da variare in funzione alle tue esigenze
if ($_FILES['newfoto']['type'] == "image/gif" or $_FILES['newfoto']['type'] == "image/jpg" or $_FILES['newfoto']['type'] == "image/jpeg"){//se la foto è uno di queti tre formati proseguo
copy ($_FILES['newfoto']['tmp_name'], "/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$_FILES['newfoto']['name']);//copio la foto nella directory che ho creato (deve avere tutti i permessi di scrittura attivi)
$foto3=$_FILES['newfoto']['name'];
//CONTROLLO SE ESISTE UN NOME UGUALE NELLA DIRECTORY (Praticamente impossibile perchè il nome foto è il timestamp di salvataggio, comunque...):
$ra=time();//variabile con il timestamp
$veriffoto="/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$ra.".jpg";
while(is_file($veriffoto)){//Proseguo con il ciclo while fino a quando non trovo un nome libero
$ra=time();
$veriffoto="/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$ra.".jpg";
}
$foto4=$ra;
//MEMORIZZO I DATI NEL DATABASE
$ipfoto=$_SERVER['REMOTE_ADDR'];//ricavo l'ip del navigatore
mysql_db_query($database,"insert into foto (nomefoto, ipfoto, commento, alt) values('".$foto4."', '".$ipfoto."', '".$commento."', '".$foto3."')",$link);
//adesso cambio il nome della foto
rename("/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$foto3, "/home/httpd/vhosts/nome_vostro_sito/httpdocs/ nome_vostra_directory_foto/".$foto4.".jpg");//Rinomino la foto che in precedenza avevo salvato con il suo vero nome
$errornewfoto=2;//nessun errore
}
else{
$errornewfoto=3;//formato NON supportato
}
}
else{
$errornewfoto=4;//foto troppo grande
}
}
else{
$errornewfoto=5;//termini e condizioni NON letti
}
}
//MESSAGGI DI ERRORE O CONFERMA
if($errornewfoto==2){echo"<br><br><center>FOTO INSERITA CON SUCCESSO</center><br><br>";}
if($errornewfoto==3){echo"<br><br><center>FORMATO FOTO NON SUPPORTATO<BR>La foto NON è stata salvata</center><br><br>";}
if($errornewfoto==4){echo"<br><br><center>FOTO TROPPO GRANDE<BR>La foto NON è stata salvata</center><br><br>";}
if($errornewfoto==5){echo"<br><br><center>TERMINI NON LETTI<BR>La foto NON è stata salvata</center><br><br>";}
//DA ADESSO CHIUDO CON php E PROSEGUO CON IL FORM HTML
?>
<center>
<table width="500" cellpadding="15">
<tr><td align="center">
<fieldset style="margin:10px 0px 0px 0px">
<legend>Inserisci una foto:</legend>
<div style="padding:3px">
<form action="nome_vostra_pagina_utilizzo_form" method="post" enctype="multipart/form-data">
<input type="hidden" name="attivaform" value="2">
<textarea rows="8" cols="80" wrap="virtual" style="background:#FFFFE6 ; font-size: 9px; COLOR: #C0C0C0; FONT-FAMILY: Verdana, arial;">
Termini, condizioni e privacy
ASSOLUTAMENTE VIETATO:
- Inserire foto che possono risultare: offensive, pornografiche, a sfondo razziale, illegali secondo leggi vigenti italiane ed internazionali.
- Inserire immagini coperte da copyright (anche se ne siete i proprietari).
- Inserire immagini che possano violare la privacy di terze parti.

ALTRE CONDIZIONI:
- TUTTE le immagini inserite potranno essere cancellate SOLO dal webmaster del sito allwebfree.it
- Il navigatore è il solo responsabile del materiale da lui stesso salvato.
- Tutto ciò che è legato direttamente ed anche indirettamente all'utilizzo del seguente script può variare o cessare senza preavviso o comunicazione alcuna.
- Il codice IP di chi inserisce l'immagine, la data e l'ora dell'inserimento sono visibili da ogni utente.
</textarea><br>
Ho letto ed accetto le condizioni
<font color="red"><b>*</b></font><input type="checkbox" name="termini" value="2">
<br>
<br>
<font color="blue" size="2"><b>Carica foto:</b></font><br>
Puoi inserire immagini di formato .jpg .jpeg .gif<br>
e con grandezza NON superiore a 100 byte (piccole).<br>
Per motivi di spazio nello script di esempio le immagini saranno visibili con formato 60x60px.<br>
<input type="file" name="newfoto" size="18"><br>
<br>
<input type="text" name="commentofoto" value="commenta..." size=30 maxlength=100><br>
<br>
<input type="submit" style="font-size : 10px; color : blue; background:#CECEFF ; font-family :verdana, arial; font-weight : bold;" value="Invia"><br>
<b>N.B.</b> Devi attendere che la foto sia caricata sul nostro sito
</form>
</div>
</fieldset>
</td></tr></table>
</center>
<br>
<br>
<br>
<center><h3>FOTO INSERITE:</h3></center>
<center>Le foto sono ordinate per data di inserimento<br>
Per motivi di spazio saranno visibili con formato 60x60px.</center><br>
<br>
<br>
<?
//RIAPRO php E MOSTRO LE FOTO FINORA SALVATE
$queryfoto=mysql_db_query($database,"select * from foto order by nomefoto DESC ",$link);
$risultati=mysql_num_rows($queryfoto);
//TROVO IL NUMERO DI PAGINE
$rispag=15;//15 sono i risultati per pagina (5 file da 3) modificatelo in funzione delle vs. esigenze
$numpag=ceil($risultati/$rispag);//numero di pagine
//agisco sulle variabili del ciclo while (vedi sotto) per estrarre SOLO i risultati che mi interessano (in base al numero di pagina)
if(!isset($hfoto) or $hfoto==0){$aa=0; $risultati2=$rispag;}//se sono alla pagina iniziale mostro i primi 15 risultati
else{$aa=$hfoto*$rispag; $risultati2=$aa+$rispag;}//altrimenti mostro i risultati in base al numero della pagina
if($risultati2>$risultati){$risultati2=$risultati;}//se sono nell'ultima pagina evito di mostrare risultati inesistenti
//TABELLA CON IL NUMERO DI PAGINE E LORO LINK
echo"<fieldset style=\"margin:10px 0px 0px 0px\">
<legend>".$numpag." pagine:</legend>
<div style=\"padding:3px\">";
for($aa3=0;$aa3<$numpag;$aa3++){
$aa3b=$aa3+1;//$aa3b deve essere una unità superiore al reale numero della pagina, altrimenti partiamo dalla pagina zero, la usiamo solo per mostrare il numero di pagina al navigatore, nel link utiliziamo $aa3
echo" <a href=\"articolo_php_salvare_dati_da_pc_utente_2.php?hfoto=".$aa3."\">".$aa3b."</a> ";
}
echo"</div>
</fieldset>";
$aa2=0;//veriabile per andare 'a capo' nella tabella delle foto
echo"<table width=\"100%\"><tr>";
while($aa<$risultati2){//Queste due variabili sono risultate dalle pagine trovate
//ESTRAGGO I DATI DAL DATABASE
$nomefoto=@mysql_result($queryfoto,$aa,"nomefoto");
$timefoto=date('d-m-y H:i:s',$nomefoto);
$ipfoto=@mysql_result($queryfoto,$aa,"ipfoto");
$commento=@mysql_result($queryfoto,$aa,"commento");
$alt=@mysql_result($queryfoto,$aa,"alt");
if($aa2==3){echo"</tr><tr>"; $aa2=0;}//se modifico questo dato (adesso 3) ottengo + o - risultati per riga
echo"<td align=\"center\"><img width=\"60\" height=\"60\" src=\"nome_vostra_directory_foto/".$nomefoto.".jpg\" alt=\"".$alt."\"><br>
<font size=\"1\">
Inserito il ".$timefoto."<br>
Da:".$ipfoto."<br>
</font>
COMMENTO:<br>
".$commento."
</td>";
$aa++;
$aa2++;
}
echo"</tr></table>";
?>



Spiegazione:

Lo script in oggetto è formato da due script che agiscono in contemporanea. Il primo memorizza le immagini, i commenti ed i dati, mentre il secondo estrae tutte le informazioni dal database mostrando le immagini a video:
  • ricavo e memorizzo foto e dati
    Questo passaggio è inserito all'inizio pagina perchè altrimenti nella fase (successiva) di lettura dati non troveremo i dati appena salvati (che sarebbero ancora da salvare).
  • Form
    Codice html con form per l'inserimento dei dati.
  • script lettura dati:
    • Leggo i dati dal database.
    • Trovo il numero di pagine ottenute (in base al numero dei dati) e li scrivo con il link relativo in una tabella.
    • Scrivo i dati ottenuti dal database mostrando l'immagine
Da notare che per ragioni pratiche in questo script le immagini sono salvate TUTTE con formato .jpg , a prescindere dal loro formato iniziale.
Sussiste inoltre un limite alla sicurezza molto grosso. In pratica per velocizzare la stesura dello script e per escludere dati dal database abbiamo associato il nome della foto al timestamp del salvataggio.
Un malintenzionato potrebbe creare una foto con lo stesso nome di una foto già contenuta nel database e potrebbe cancellarla nel momento del salvataggio (questo è possibile perchè salviamo la foto prima ancora di rinominarla).
Per ovviare a questo problema basta inserire un ciclo IF e controllare se nella directory esiste già una foto con quel nome prima del salvataggio (il codice è molto simile al primo ciclo while).

Errori e modifiche:

Per utilizzare lo script dovete necessariamente modificare alcuni dati:
1) Le variabili di collegamento database (Sono variabili che conoscete solo voi).
2) Al posto delle righe /home/httpd/vhosts/nome_vostro_sito/httpdocs/nome_vostra_directory_foto/ dovrete inserire l'indirizzo per la connessione alla directory dove avete salvato le immagini (chiedete al supporto del vostro spazio, oppure verificate sul vostro programma FTP).
3) Nella riga iniziale del form dovrete inserire l'indirizzo della pagina che utilizza lo script.

Il codice sopra descritto è lo stesso codice che gira nella pagina di esempio. Tutti i possibili errori che potrebbero nascere dal suo utilizzo sono errori dovuti all'errata battitura del testo.

Come già detto nella prima pagina ricordate che TUTTI I COMMENTI DEVONO STARE SULLA STESSA RIGA!!
Se avete dubbi sulla loro inclusione cancellateli.




TORNA ALLA PRIMA PAGINA








Warning: Unknown: write failed: Disk quota exceeded (122) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/home/allweb/tmp/) in Unknown on line 0