Tutorials

Bestand uploaden naar MySQL database

In deze tutorial leer je hoe je een bestand kunt uploaden naar een MySQL database

Pagina 1

Voorbereidingen

Introductie

In deze tutorial ga ik jullie leren hoe je bestanden kunt verwerken in een MySQL database. We gaan onder andere bespreken hoe je een bestand upload naar een MySQl database en het bestand vervolgens via een HTTP interface er weer uit kunt halen.

Ik moet er wel even bij vermelden dat dit behoorlijk wat van je database vraagt. Hiertoe kun je in plaats van LONGBLOB in de query beter een kleiner gegevenstype kiezen (zoals TINYBLOB). In de meeste gevallen is het zelfs niet wenselijk om gebruik te maken van InnoDB engine om bestanden op te slaan. Gebruik dan de conventionele HTTP upload methode om een bestand te uploaden (http://nl3.php.net/manual/nl/features.file-upload.php).

Benodigdheden

Een server met PHP interpreter en ondersteuning voor MySQL (die tevens HTTP uploads toestaat)
Een MySQL database met de benodigde rechten

Inhoud

Een MySQL database voorbereiden
Het uploadformulier opbouwen
Het uploadscript
De downloads-pagina
Het downloadscript

Een MySQL database voorbereiden

Alvorens we kunnen beginnen met het schrijven van het werkelijke script, zullen we eerst een database moeten voorbereiden. Meld je hiertoe aan op je MySQL server en maak een database aan, genaamd "FILES". Na het aanmaken van de database kunnen we de InnoDB tabel gaan genereren waarin we de bestanden gaan verwerken. Voor de ongeduldigen onder ons heb ik voor deze handelingen een script geschreven:

<?php

if(!empty($_POST))
{

$host=$_POST['host'];
$username=$_POST['username'];
$pass=$_POST['pass'];

mysql_connect($host,$username,$pass) or die(mysql_error()); 

if(!mysql_select_db($_POST['database']))
mysql_query("CREATE DATABASE ".$_POST['database'].";") or die(mysql_error());
mysql_select_db($_POST['database']) or die(mysql_error());

mysql_query("CREATE TABLE FILES (
FILE_ID INT AUTO_INCREMENT PRIMARY KEY,
FILENAME TEXT,
FILETYPE TEXT,
FILESIZE INT,
CONTENT LONGBLOB,
DATUM DATETIME
);") or die(mysql_error());

echo("Database succesvol geprepareerd");

mysql_close();

}

?>
<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
<table>
<tr>
<td>Hostnaam</td>
<td><input type="text" name="host"></td>
</tr>
<tr>
<td>Gebruikersnaam</td>
<td><input type="text" name="username"></</td>
</tr>
<tr>
<td>Wachtwoord</td>
<td><input type="password" name="pass"></</td>
</tr>
<tr>
<td>Database</td>
<td><input type="text" name="database"></</td>
</tr>
<tr>
<td><input type="submit" value="Genereren"></td>
</tr>
</table>
</form>


Verwerk deze code in een .php bestand en sla het bestand op alvorens door te gaan met de volgende stap.

Deze regels code tussen if(!empty($_POST)){} worden uitgevoerd als er een zogenaamde POST array naar de server is verstuurd (dus als je de submit-knop hebt ingedrukt). De eerste vier regels zijn om een verbinding tot stand te brengen met de database. In de volgende regels controleren we of de gespecificeerde database bestaat. Indien dat niet zo is, zal deze worden aangemaakt. Vervolgens wordt met deze database verbinding gemaakt. Het eerste veld van de tabel is FILE_ID (de primaire sleutel). Deze is vereist om later snel bij je gegevens te kunnen komen. Dit nummer wordt automatisch door de database toegekend, dus we hoeven de primaire sleutel niet zelf toe te voegen. Verder is er een veld genaamd CONTENT (van het gegevenstype LONGBLOB). Het type BLOB verschilt van overige velden omdat de data in dit veld geen karakterset heeft, maar wordt behandelt als een binaire string (uitermate geschikt voor bestanden dus). LONGBLOB is geschikt voor opslag tot maximaal 4294967295 (zo'n 4 GB), dus de enige beperking is het maximum dat je server heeft voor HTTP uploads. De overige velden spreken voor zich, lijkt mij.
Pagina 2

Het downloadscript

<?php

include("mijn_sql_connectie.php");

$query=mysql_query("SELECT filename,filetype,content FROM files WHERE file_id='".$_GET['id']."';");
$row=mysql_fetch_assoc($query);

header("Content-Type: ".$row['filetype']);
header("Content-Disposition: attachment; filename=".$row['filename']);
echo($row['content']);

mysql_free_result();
mysql_close();

?>

Dit script haalt de data uit de tabel en serveert het bestand aan de client middels HTTP.
Pagina 3

Het uploadformulier opbouwen

Voor het uploadformulier hebben we het bestandsveld nodig en een optioneel veld, genaamd OMSCHRIJVING. Het is ook noodzakelijk om de codeermethode in het formulier te specificeren voor een correcte gegevensoverdracht. Dit omdat er een bestand wordt verzonden via $_POST.

<form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>" enctype="multipart/form-data">
<table>
<tr>
<td>Bestand</td>
<td><input type="file" name="input"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Uploaden"></td>
</tr>
</table>
</form>


Verwerk deze code in een .php bestand en sla het bestand op alvorens door te gaan met de volgende stap.
Pagina 4

Einde

Dit is het einde van de tutorial. Mocht je nog vragen/opmerkingen hebben, dan hoor ik het graag.
Pagina 5

Het uploadscript

Open het eerder opgeslagen bestand van het uploadformulier en voeg bovenaan deze code toe:

<?php

if(!empty($_FILES))
{
$filename = $_FILES['input']['name'];
$filetype = $_FILES['input']['type'];
$filesize = $_FILES['input']['size'];
$tmpname = $_FILES['input']['tmp_name'];
$content = file_get_contents($tmpname);
$fp = fopen($tmpname,'r');
$content = fread($fp,$filesize);
$content = addslashes($content);
include("mijn_sql_connectie.php");
$query="INSERT INTO FILES (FILENAME,FILETYPE,FILESIZE,CONTENT,DATUM) VALUES ('".$filename."','".$filetype."','".$filesize."','".$content."',NOW());";
mysql_query($query) or die(mysql_error());
echo("<table>\n");
echo("<tr>\n");
echo("\t<td>Bestandsnaam</td><td>".$filename."</td>\n");
echo("</tr>\n");
echo("<tr>\n");
echo("\t<td>Type</td><td>".$filetype."</td>\n");
echo("</tr>\n");
echo("<tr>\n");
echo("\t<td>Grootte</td><td>".$filesize."</td>\n");
echo("</tr>\n");
mysql_close();
}

?>

Eerst controleert de server of er een bestand is geupload (alle gegevens die via een file veld zijn verzonden zijn toegankelijk via de array $_FILES). We laden de eigenschappen van het bestand in lokale variabelen, waarna we de inhoud van het bestand laden door de tijdelijke locatie aan te roepen van het bestand. Ve voegen vervolgens slashes aan de inhoud toe om te voorkomen dat de informatie in een later stadium verkeerd wordt verwerkt. Vervolgens bouwen we de query op die ervoor zorgt dat de gegevens in de database terecht komen. Voor de beginners onder ons: Wees jezelf ervan bewust dat we FILE_ID niet hebben gespecificeerd in de INSERT query, omdat dit nummer automatisch door de database wordt toegewezen.

Waarschuwing: Het MIME-type van het bestand wordt door de browser toegekend. Omdat iedere browser daar een andere methode voor heeft, kun je het beste server-sided een MIME-type toekennen. Hiertoe heb ik een functie geschreven die je in staat stelt om het MIME-type van het bestand te verifiëren, waarna het script alle niet-gespecificeerde MIME-typen weigert. Zie http://www.phphulp.nl/php/scripts/1/740/
Pagina 6

De downloads-pagina

<?php

include("mijn_sql_connectie.php");

$query=mysql_query("SELECT file_id,filename,filetype,filesize,datum FROM files;");

echo("<table>");
while($row=mysql_fetch_assoc($query))
{
echo("<tr>\n");
echo("\t<td><a href='download.php?id=".$row['file_id']."'>".$row['filename']."</a></td>\n");
echo("\t<td>".$row['filetype']."</td>\n");
echo("\t<td>".$row['filesize']."</td>\n");
echo("</tr>\n");
}
echo("</table>");

mysql_free_result();
mysql_close();

?>

Dit script toont zonder al te veel mooie franjes alle aanwezige bestanden in de database. Via de URL wordt het nummer van het bestand aan het downloadscript doorgegeven, die vervolgens het bestand serveert.

Reacties

0
Nog geen reacties.