Tutorials
Bestanden uploaden naar map/database
Je kent het wel je hebt een forum met atavars en die wilt gebruiken.......
Pagina 1
Inleiding
Je kent het wel....
Je hebt een forum met atavars of profielen site waar bezoekers je plaatje kunnen uploaden.
Ik kan het begrijpen, je wilt liever niet hebben dat iedereen of jouw ftp passwoord beschikt en van je hoster/of je zelf heb/mag je geen anonymous ftp.
Dan zijn er 3 opties:
a. Link van de eigen webruimte gebruiker.
Hellaas sommige server is het niet mogelijk om bestanden te leechen.
b. De bestanden uploaden naar een map die schrijf rechten heeft.
c. Bestanden uploaden naar je database.
In deze tutorial probeer ik jullie de laatste 2 zo goed mogelijk uit te leggen. De eerste en de tweede pagina's zijn nodig voor allebei de manieren. Als je het direct wilt uploaden naar een map gebruik dan pagina 3 en met de database 4,5 en 6.
En hopen dat alle vragen zijn op gelost.
Deze tutorial werkt volledig met superglobals dus $_POST['var'];
Hierdoor zal hij niet werken op php ouder dan 4.1.
Je hebt een forum met atavars of profielen site waar bezoekers je plaatje kunnen uploaden.
Ik kan het begrijpen, je wilt liever niet hebben dat iedereen of jouw ftp passwoord beschikt en van je hoster/of je zelf heb/mag je geen anonymous ftp.
Dan zijn er 3 opties:
a. Link van de eigen webruimte gebruiker.
Hellaas sommige server is het niet mogelijk om bestanden te leechen.
b. De bestanden uploaden naar een map die schrijf rechten heeft.
c. Bestanden uploaden naar je database.
In deze tutorial probeer ik jullie de laatste 2 zo goed mogelijk uit te leggen. De eerste en de tweede pagina's zijn nodig voor allebei de manieren. Als je het direct wilt uploaden naar een map gebruik dan pagina 3 en met de database 4,5 en 6.
En hopen dat alle vragen zijn op gelost.
Deze tutorial werkt volledig met superglobals dus $_POST['var'];
Hierdoor zal hij niet werken op php ouder dan 4.1.
Pagina 2
Voorwerk (sql + conectie)
Als je met mysql werkt heb je een database nodig.
CREATE TABLE `images` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(64) NOT NULL default '',
`type` varchar(64) NOT NULL default '',
`length` int(11) NOT NULL default '0',
`content` mediumblob NOT NULL,
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
De ID is een getal dat uniek is en wanneer er record toe wordt gevoegd steeds één omhoog gaat.
Deze heb je nodig om een bestand te kunnen opvragen door middel van
<img scr="images.php?id=2" />
Zie hierover verder op in de tutorial,
Voor dit script heb je ook een config.php om de database verbinding tot stand te brengen
<?php
$host = "localhost";
$username = "lalalall";
$password = "geheim";
$db_naam = "database";
$acces = "Sorry I can't connect to de Database server. Please send a e-mail to [email protected]";
//connect to database
@mysql_connect($host,$username,$password) or die($acces);
@mysql_select_db("$db_naam");
?>
CREATE TABLE `images` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(64) NOT NULL default '',
`type` varchar(64) NOT NULL default '',
`length` int(11) NOT NULL default '0',
`content` mediumblob NOT NULL,
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;
De ID is een getal dat uniek is en wanneer er record toe wordt gevoegd steeds één omhoog gaat.
Deze heb je nodig om een bestand te kunnen opvragen door middel van
<img scr="images.php?id=2" />
Zie hierover verder op in de tutorial,
Voor dit script heb je ook een config.php om de database verbinding tot stand te brengen
<?php
$host = "localhost";
$username = "lalalall";
$password = "geheim";
$db_naam = "database";
$acces = "Sorry I can't connect to de Database server. Please send a e-mail to [email protected]";
//connect to database
@mysql_connect($host,$username,$password) or die($acces);
@mysql_select_db("$db_naam");
?>
Pagina 3
Het formulier
Om een bestand te versturen heb je een formulier nodig. Duuhh dat snapt iedereen wel.
Maar er zijn toch een paar verschillen met de standaard formulier die je maakt. Die ga ik nu even uit leggen (Omdat ik altijd met xhtml werk zal de html code iets verschillen dan je gewend bent. !)
<form action="<?php echo $ _SERVER["PHP_SELF"];?>" enctype="multipart/form-data" method="post">
<input name="bestand" type="file" /><input type="submit" value="Uploaden!" /></from>
Eerst de uitleg van de form tag
Die zegt met de action dat hij naar de pagina wordt toegestuurd die nu dezelfde bestandsnaam heeft als deze.
method = “post”. Die zegt dat de bestand naar de server moet worden gestuurd met de post protocol. De andere optie was ja je raad het al get. Dat gebruik ik liever niet.... en vooral met bestanden nooit gebruiken!
Nu komt het speciale de enctype. Deze zegt dat de het forumlier uit 2 delen staat, namelijk uit een formulier en een bestand de data.
Nu upload ik de zooi en hij staat op de server.
Maar er zijn toch een paar verschillen met de standaard formulier die je maakt. Die ga ik nu even uit leggen (Omdat ik altijd met xhtml werk zal de html code iets verschillen dan je gewend bent. !)
<form action="<?php echo $ _SERVER["PHP_SELF"];?>" enctype="multipart/form-data" method="post">
<input name="bestand" type="file" /><input type="submit" value="Uploaden!" /></from>
Eerst de uitleg van de form tag
Die zegt met de action dat hij naar de pagina wordt toegestuurd die nu dezelfde bestandsnaam heeft als deze.
method = “post”. Die zegt dat de bestand naar de server moet worden gestuurd met de post protocol. De andere optie was ja je raad het al get. Dat gebruik ik liever niet.... en vooral met bestanden nooit gebruiken!
Nu komt het speciale de enctype. Deze zegt dat de het forumlier uit 2 delen staat, namelijk uit een formulier en een bestand de data.
Nu upload ik de zooi en hij staat op de server.
Pagina 4
Uploaden naar database
Je hebt een bestand geupload met het formulier die je in het begin gemaakt heb. Nu we gaan we het bestand openen, in php uit lezen en de gegevens opslaan in je database.
<?php
include("config.php");
//in config.php wordt er en connectie gelegd met de database + database geselecteerd
if($_SERVER["REQUEST_METHOD"]=="POST"){
//Controle door middel van posten
// we willen het bestand open zie php functies!
$fp = if(!@fopen($HTTP_POST_FILES[file][tmp_name],"r")){
echo "Oeps een foutje";
//Als het open van het bestand niet lukt krijg de error anders gaan we verder met het uitlezen
}else{
$content = fread($fp,filesize($HTTP_POST_FILES[file][tmp_name])); /* eerst de inhoud van het bestand uitlezen */
fclose($fp); /* bestand sluiten */
/*alles is klaar we gaan nu alles in de database opslaan. Na afloop laten we de url zien om de image nog te kunnen op vragen.*/
$sql = "INSERT INTO images VALUES('','" . $HTTP_POST_FILES[file][name] . "','" . $HTTP_POST_FILES[file][type] . "','" . filesize($HTTP_POST_FILES[file][tmp_name]) . "','" . addslashes($content) . "' ")";
mysql_query($sql) or Die(mysql_error());
/* Query uit voeren */
$sql = "SELECT * FROM `images` ORDER BY `id` ASC LIMIT 0 , 1 ";
$query = mysql_query($sql);
$array = mysql_fetch_array($query);
mysql_query($sql);
/* even de id opvragen */
print"Your image is succesfully uploaded to te server and saved in our database. If you want to request the image use this link:<br /> http://www.mol-clan.nl/upload/image.php?id=".$array['id']." ";
// alles even printen
}else{
echo "error";
}
}else{
echo "forumelier";
}
?>
<?php
include("config.php");
//in config.php wordt er en connectie gelegd met de database + database geselecteerd
if($_SERVER["REQUEST_METHOD"]=="POST"){
//Controle door middel van posten
// we willen het bestand open zie php functies!
$fp = if(!@fopen($HTTP_POST_FILES[file][tmp_name],"r")){
echo "Oeps een foutje";
//Als het open van het bestand niet lukt krijg de error anders gaan we verder met het uitlezen
}else{
$content = fread($fp,filesize($HTTP_POST_FILES[file][tmp_name])); /* eerst de inhoud van het bestand uitlezen */
fclose($fp); /* bestand sluiten */
/*alles is klaar we gaan nu alles in de database opslaan. Na afloop laten we de url zien om de image nog te kunnen op vragen.*/
$sql = "INSERT INTO images VALUES('','" . $HTTP_POST_FILES[file][name] . "','" . $HTTP_POST_FILES[file][type] . "','" . filesize($HTTP_POST_FILES[file][tmp_name]) . "','" . addslashes($content) . "' ")";
mysql_query($sql) or Die(mysql_error());
/* Query uit voeren */
$sql = "SELECT * FROM `images` ORDER BY `id` ASC LIMIT 0 , 1 ";
$query = mysql_query($sql);
$array = mysql_fetch_array($query);
mysql_query($sql);
/* even de id opvragen */
print"Your image is succesfully uploaded to te server and saved in our database. If you want to request the image use this link:<br /> http://www.mol-clan.nl/upload/image.php?id=".$array['id']." ";
// alles even printen
}else{
echo "error";
}
}else{
echo "forumelier";
}
?>
Pagina 5
Variable
Zo, je hebt gewacht en het bestand staat op de server. Maar helaas jij zult er nooit bijkomen, waarom niet.
PHP uploadt de bestanden naar een map genaamd temp. Deze map wordt na afloop van de script elke keer geleegd. Gevolg geen bestand meer op de server. Je zult dus wat actie moeten ondernemen. Om dit in de volgende hoofdstukken beter uit te leggen moet ik eerst even wat uit leggen over de variabelen die je kunt gebruiken.
Variable Betekenis
$HTTP_POST_FILES['file']['name'] De orginele bestandsnaam
$HTTP_POST_FILES['file']['size'] De grote van je bestand in bytes. (Handig voor controle)
$HTTP_POST_FILES['file']['type'] Content type van je geuploade bestand. (Handig voor controle + verplicht voor het uploaden van een bestand naar de database.)
$HTT_POST_FILES['file']['tmp'] De tijdelijke naam van het bestand op de server. Wordt na afloop gewist.
PHP uploadt de bestanden naar een map genaamd temp. Deze map wordt na afloop van de script elke keer geleegd. Gevolg geen bestand meer op de server. Je zult dus wat actie moeten ondernemen. Om dit in de volgende hoofdstukken beter uit te leggen moet ik eerst even wat uit leggen over de variabelen die je kunt gebruiken.
Variable Betekenis
$HTTP_POST_FILES['file']['name'] De orginele bestandsnaam
$HTTP_POST_FILES['file']['size'] De grote van je bestand in bytes. (Handig voor controle)
$HTTP_POST_FILES['file']['type'] Content type van je geuploade bestand. (Handig voor controle + verplicht voor het uploaden van een bestand naar de database.)
$HTT_POST_FILES['file']['tmp'] De tijdelijke naam van het bestand op de server. Wordt na afloop gewist.
Pagina 6
uit de database
We kunnen de bestanden nu wel opslaan maar niet op openen. Hoe lossen we dit op. Met php natuurlijk
<?php
/* image.php */
if (!empty($id)) {
include("config.php");
//Haal gegevens op uit de db
$sql = "SELECT type,length,content FROM images WHERE id = '$id' LIMIT 0,1";
$result = @mysql_query($sql) or Die(mysql_error());
while ($row = mysql_fetch_array($result)) {
Header("Content-Length: " . $row[length] . "\nContent-Type: " . $row[type]);
print $row[content];
//wanneer de gegevens zijn opgehaald echo alles!
}
mysql_close($db);
}
?>
Je kan je plaatje opvragen in je html code door de img tag te gebruiken.
Voorbeeld
<img scr="image.php?id=iets" />
Dit script kun je gebruiken voor het uploaden van bestanden en het maken van een waterdicht antileech syteem
Nog 1 ding
Zoals je ziet gebruik je bij het toevoegen van content in de database de functie addslashes. Nu vraag je natuurlijk af waarom bij het er uit halen niet hoeft te strippen sterker nog je hebt zelfs kans op een error!
<?php
/* image.php */
if (!empty($id)) {
include("config.php");
//Haal gegevens op uit de db
$sql = "SELECT type,length,content FROM images WHERE id = '$id' LIMIT 0,1";
$result = @mysql_query($sql) or Die(mysql_error());
while ($row = mysql_fetch_array($result)) {
Header("Content-Length: " . $row[length] . "\nContent-Type: " . $row[type]);
print $row[content];
//wanneer de gegevens zijn opgehaald echo alles!
}
mysql_close($db);
}
?>
Je kan je plaatje opvragen in je html code door de img tag te gebruiken.
Voorbeeld
<img scr="image.php?id=iets" />
Dit script kun je gebruiken voor het uploaden van bestanden en het maken van een waterdicht antileech syteem
Nog 1 ding
Zoals je ziet gebruik je bij het toevoegen van content in de database de functie addslashes. Nu vraag je natuurlijk af waarom bij het er uit halen niet hoeft te strippen sterker nog je hebt zelfs kans op een error!
Pagina 7
Naar map uploaden
Eindelijk kunnen we aan de slag met het copieren naar de juiste map. (Naar map op je webspace!)
<?php
//het defineren van een paar variabelen
$dir = "volledige pad";
if($_SERVER["REQUEST_METHOD"]=="POST"){
//Controle van de manier request pagina. Wanneer gepost wordt het script in werking gezet!
if(!move_uploaded_file($HTTP_POST_FILES['file']['tmp_name'],
$dir . $HTTP_POST_FILES['file']['name'])) {
//wanneer sucessfull
echo "gelukt. Het bestand staat nu in " . $dir . $HTTP_POST_FILES['file']['name'] ." ";
}else{
//wanneer ere en error is
echo "Oeps een foutje :(";
}
}else{
//Wanneer dit niet viapost protocol is gegaan
echo "het formulier";
}
?>
Op dit moment kun je alle bestanden met elke grote uploaden ook eventuele virrusen. Je kunt dus begrijpen dat het niet echt 100% veilig is omdat openbaar te zetten. Om dat te doen moet het script kijken naar de extensie of de contenttype en de grootte van het bestand.
Voetnoot:
Als je bestand upload op welke mannier dan ook krijgt het bestand de rechten.
Als dit met php upload krijgt dus appache de rechten en jij niet. Hoe kun je het oplossen.
Nadat het uploaden chmod je het bestand naar 777 in php. Dit doe je met de volgende code.
<?php
chmod ($bestandsnaam,0755);
?>
Je kunt je bestand opvragen door
http://www.domein.nl/map/bestand.ext
<?php
//het defineren van een paar variabelen
$dir = "volledige pad";
if($_SERVER["REQUEST_METHOD"]=="POST"){
//Controle van de manier request pagina. Wanneer gepost wordt het script in werking gezet!
if(!move_uploaded_file($HTTP_POST_FILES['file']['tmp_name'],
$dir . $HTTP_POST_FILES['file']['name'])) {
//wanneer sucessfull
echo "gelukt. Het bestand staat nu in " . $dir . $HTTP_POST_FILES['file']['name'] ." ";
}else{
//wanneer ere en error is
echo "Oeps een foutje :(";
}
}else{
//Wanneer dit niet viapost protocol is gegaan
echo "het formulier";
}
?>
Op dit moment kun je alle bestanden met elke grote uploaden ook eventuele virrusen. Je kunt dus begrijpen dat het niet echt 100% veilig is omdat openbaar te zetten. Om dat te doen moet het script kijken naar de extensie of de contenttype en de grootte van het bestand.
Voetnoot:
Als je bestand upload op welke mannier dan ook krijgt het bestand de rechten.
Als dit met php upload krijgt dus appache de rechten en jij niet. Hoe kun je het oplossen.
Nadat het uploaden chmod je het bestand naar 777 in php. Dit doe je met de volgende code.
<?php
chmod ($bestandsnaam,0755);
?>
Je kunt je bestand opvragen door
http://www.domein.nl/map/bestand.ext
Pagina 8
Naar database
Je kunt inmiddels bestanden uploaden naar je server. Maar soms wil dat niet of je wilt een antileech systeem maken. (Het trekken van bestanden van je server door andere en dit te voorkomen) dan kan het een optie zijn om dit in je database te stoppen. Dit kan in BLOB Binairy Large Objects.
Je slaat dus alles in binary code op in je database.
Om binaire data op te slaan, gebruik je BLOB velden. Oftewel: Binairy Large Objects. MySQL heeft een aantal verschillende soorten BLOBS, dit zijn: TINYBLOB, BLOB, MEDIUMBLOB en LONGBLOB. Uiteraard zijn de verschillen tussen deze soorten, de maximale grootte van het veld.
X TINYBLOB: maximaal 256 bytes
X BLOB: maximaal 65.537 bytes (64 KB)
X MEDIUMBLOB: maximaal 16.777.218 bytes (16 MB)
X LONGBLOB: maximaal 4.294.967.299 bytes (4 GB)
In een normale BLOB kun je met gemak een plaatje in uploaden. Maak je gebruik van groote bestanden in een medium of longblob een betere oplossing
Je slaat dus alles in binary code op in je database.
Om binaire data op te slaan, gebruik je BLOB velden. Oftewel: Binairy Large Objects. MySQL heeft een aantal verschillende soorten BLOBS, dit zijn: TINYBLOB, BLOB, MEDIUMBLOB en LONGBLOB. Uiteraard zijn de verschillen tussen deze soorten, de maximale grootte van het veld.
X TINYBLOB: maximaal 256 bytes
X BLOB: maximaal 65.537 bytes (64 KB)
X MEDIUMBLOB: maximaal 16.777.218 bytes (16 MB)
X LONGBLOB: maximaal 4.294.967.299 bytes (4 GB)
In een normale BLOB kun je met gemak een plaatje in uploaden. Maak je gebruik van groote bestanden in een medium of longblob een betere oplossing
Reacties
0