Créer un ZIP contenant des fichiers BLOB (MySQL)

Résolu/Fermé
Skimae Messages postés 6 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 13 septembre 2021 - 6 juil. 2015 à 10:01
Skimae Messages postés 6 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 13 septembre 2021 - 6 juil. 2015 à 15:40
Bonjour à tous,



Je suis entrain de créer un système de stockage de fichiers pour l'une de mes applications, et il m'a été imposé de stocker les fichier sous dans des champs BLOB de la base de données.

On peut discuter de la non pertinence de cette solution, mais comme je n'ai pas eu le choix, je dois quand même trouver une solution à mon problème :



J'ai un bouton "Tout télécharger" qui permet de télécharger l'ensemble des fichiers d'une affaire dans une archive .zip.

J'arrive à créer mon zip et à le télécharger, sauf que quand j'essaye d'ouvrir mes fichiers, ça ne marche pas ("le type de fichier n'est pas pris en charge ou le fichier est endommagé"), donc je suppose que la création du fichier dans mon code est mauvaise.

Voilà mon code, si vous avez une idée. Je cherche un peu partout depuis 2 jours et je n'ai toujours pas trouvé la solution, donc je me suis résolue à poster ...



(Pour mieux comprendre mon code, j'ai une table des méta données - nom fichier, date de création, nom du créateur, etc ... - et une table des fichiers BLOB par année - qui est liée par une clé étrangère à la ligne de méta-données correspondante. Je les ai donc renommées <table_metaDonnees> et <table_BLOB>)

Création du .zip :

$sql = "SELECT * FROM table_metaDonnees
WHERE idAffaire=".$idAffaire."
AND type=".$type."
AND etatCourrier=1
;";
$req = mysql_query($sql);

$zip = new ZipArchive();
$cheminZip = "tmp/archive_".date("Y-m-d_h-i-s").".zip";
$res = $zip->open($cheminZip,ZipArchive::CREATE);

if ($res === TRUE) {
while ($data = mysql_fetch_assoc($req)) {
$cheminFichier = "fichier.php?idCourrier=".$data["idCourrier"];
//$cheminFichier = "fichier.php";
$nomFichier = $data["nomFichier"].$data["extFichier"];
$zip->addFromString($nomFichier,$cheminFichier);

}
//$zip->addFile("test.txt");
$zip->close();

header('Content-disposition: attachment; filename= desherence_'.$idAffaire.'_'.$libType.'.zip');
header('Content-Type: application/force-download');
header('Content-Transfer-Encoding: application/zip');
header('Content-Length: '.filesize($cheminZip));
header('Pragma: no-cache');
header('Expires: 0');
ob_clean();
readfile($cheminZip);


} else {
echo "ERREUR : Impossible de créer l\'archive .zip.";
}


Et chaque fichier est créé dans un script à part (qui marche quand il est tout seul, car c'est celui que j'utilise pour ouvrir/télécharger les fichiers un par un) :

Page fichier.php :

$sql = "SELECT * FROM <table_metaDonnees>
WHERE idCourrier=".$idCourrier ;
$req = mysql_query($sql);

$trouve=false;
while ($data = mysql_fetch_assoc($req)) {
$tabDate = explode("-",$data["dateCrea"]);
$annee = $tabDate[0];

// Vérification de l'existance de la table de l'année
$tableExiste=false;
if($res = mysql_query("SHOW TABLES LIKE 'table_BLOB_".$annee."';")) {
while($dt = mysql_fetch_assoc($res)) {
$tableExiste=true;
}
}

// Récupération du fichier
if ($tableExiste) {
$sql2 = "SELECT * FROM <tableBLOB_".$annee.">
WHERE idCourrier=".$idCourrier ;
$req2 = mysql_query($sql2);
while ($data2 = mysql_fetch_assoc($req2)) {
$trouve=true;
$contenuFichier = $data2["fichier"];

header("Content-Type: ".$data["typeMime"]) ; // A confirmer
header("Content-Disposition: inline; filename=\"".$data["nomFichier"].$data["extFichier"]."\"") ;
header('Content-Length: ' . strlen($contenuFichier)) ;
echo $contenuFichier ;
}
}
else {
echo "ERREUR : La table des fichiers de l'annee ".$annee." n'existe pas.<br/>";
}
}

if (!$trouve) {
echo "ERREUR : Fichier (".$idCourrier.") non trouve.<br/>";
}



J'ai essayé en remplaçant dans le premier fichier la ligne :

$zip->addFromString($nomFichier,$cheminFichier);

par

$zip->addFile($cheminFichier,$nomFichier);

Mais là le zip ne s'ouvre carrément pas ...

Est-ce que quelqu'un aurait une idée ?



Merci d'avance !
A voir également:

2 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
6 juil. 2015 à 12:08
Salut,

$cheminFichier = "fichier.php?idCourrier=".$data["idCourrier"];
$nomFichier = $data["nomFichier"].$data["extFichier"];
$zip->addFromString($nomFichier,$cheminFichier);


Tu dois bien utiliser la méthode addFromString() mais le deuxième paramètre ne dois pas être le chemin ou l'url du fichier mais directement son contenu binaire, c-a-d le retour sql de ton champ blob. Soit :
$zip->addFromString($nomFichier,$data['fichier']);
// où $data['fichier'] correspond au contenu du champ blob


Bonne journée
0
Skimae Messages postés 6 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 13 septembre 2021
6 juil. 2015 à 15:40
J'ai réécrit ma requête SQL dans mon fichier principal et ça marche !

C'est fou, après le temps que j'y ai passé, c'était si simple ^^'

Merci pour votre aide !
0