PHP : Enregistrer un fichier dans une base de données

Publié le 17 novembre 2009 par Methylbro

La classe FileFromDB

Afin de manipuler les fichiers stockées dans la base de données, je vous propose d’utiliser une classe que nous feront évoluer tout au long de ce tutoriel. Appelons la FileFromDB car chaque instance de cette classe nous permettra de manipuler un de nos fichiers.

class FileFromDB {
private $filename;
public function __construct($filename) {
$this->filename = $filename;
}
}

Le formulaire d’upload

Comme je le disait lors de l’introduction, dans notre exemple les fichiers seront envoyés par les utilisateurs. Cela nécessitera donc un petit formulaire permettant d’envoyer des fichiers.

<?php
$message = null;
if (isset($_FILES['myFile'])) {
$File = new FileFromDB($_FILES['myFile']['name']);
$File->upload($_FILES['myFile']);
$message = 'Votre fichier à bien été ajouté';
}
?>
<html>
<head>
<title>Upload</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<?php echo $message; ?>
<fieldset>
<legend>Charger un fichier</legend>
<p>
<label for="myFile">Fichier</label>
<input type="file" id="myFile" name="myFile" />
</p>
<p>
<input type="reset" value="Annuler" />
<input type="submit" value="Envoyer" />
</p>
</fieldset>
</form>
</body>
</html>

Ce formulaire restera simple et l’on omettra toutes les vérifications d’usage en termes de sécurité. Ce n’est pas le sujet abordé.

La méthode FileFromDB::upload()

Enfin nous ajouterons à notre classe FileFromDB une méthode permettant d’enregistrer notre fichier comme un objet large binaire au sein de notre table. L’extension PDO et son système de requêtes préparées nous propose un type de paramètre parfait pour résoudre les problèmes liés : PARAM_LOB.

Ainsi nous passerons comme paramètre un flux vers le fichier que l’on souhaite envoyé à la base de données au lieu de l’intégralité du contenu lui même. En travaillant avec des flux de données nous ne consommerons pas inutilement les ressources disponibles.

public function upload($file) {
global $PDO;
$stmt = $PDO->prepare("REPLACE INTO FILE (name, type, data) VALUES (?, ?, ?)");
$stmt->bindParam(1, $this->filename);
$stmt->bindParam(2, $file['type']);
$stmt->bindParam(3, fopen($file['tmp_name'], 'rb'), PDO::PARAM_LOB);
return $stmt->execute();
}

Dans un prochain article nous verrons comment lire des fichiers enregistrés dans notre base de données.