2010-06-11 4 views
1

J'ai une table de base de données qui contient de nombreux fichiers blob PDF. Je tente de combiner tous les fichiers dans un seul fichier ZIP que je peux télécharger puis imprimer.Fichiers zip Zob de base de données Zip multiples

Aidez s'il vous plaît!

<?php 
    include '../config.php'; 
    include '../connect.php'; 

    $session = $_GET['session']; 

    $query = "SELECT $tbl_uploads.username, $tbl_uploads.description, 
        $tbl_uploads.type, $tbl_uploads.size, $tbl_uploads.content, 
        $tbl_members.session 
    FROM $tbl_uploads 
    LEFT JOIN $tbl_members 
    ON $tbl_uploads.username = $tbl_members.username 
    WHERE $tbl_members.session = '$session'"; 
    $result = mysql_query($query) or die('Error, query failed'); 


    $files = array(); 
    while(list($username, $description, $type, $size, $content) = 
    mysql_fetch_array($result)) { 

     $files[] = "$username-$description.pdf"; 
    } 

    $zip = new ZipArchive; 
    $zip->open('file.zip', ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 

    header('Content-Type: application/zip'); 
    header('Content-disposition: attachment; filename=filename.zip'); 
    header('Content-Length: ' . filesize($zipfilename)); 
    readfile($zipname); 

    exit(); 


    ?> 
+0

Pourquoi pas votre travail de code actuel? Avez-vous des messages d'erreur? –

+0

Il crée un fichier zip vide. – Michael

+0

Je pense qu'il peut s'agir d'un problème de chemin d'accès/répertoire de problèmes? De plus, ai-je besoin des informations d'en-tête pour les entrées de blob? header ("Content-length: $ size"); header ("Content-type: $ type"); header ("Content-Disposition: inline; nom_fichier = $ nom_utilisateur- $ description.pdf"); – Michael

Répondre

1

Vos données PDF sont stockées dans la base de données dans les champs BLOB, je ne vois pas vous mettre ces données dans un fichier. Donc votre ZIP ne contiendra aucun fichier car vous n'ajoutez pas de vrais fichiers existants.

C'est ce que vous faites actuellement:

  • Lecture de vos données à partir de la base de données
  • Création d'un tableau de noms de fichiers
  • Création ZIP de noms de fichiers qui pourraient ne pas exister

Ce que vous devez faire:

  • Lecture de vos données à partir de la base de données
  • Création d'un tableau de noms de fichiers
  • Écrivez vos données BLOB dans ce fichiers
  • Création d'un fichier ZIP de fichiers qui existent

Exemple:

$files = array(); 
    while(list($username, $description, $type, $size, $content) = 
    mysql_fetch_array($result)) { 
     $files[] = "$username-$description.pdf"; 

     // write the BLOB Content to the file 
     if (file_put_contents("$username-$description.pdf", $content) === FALSE) { 
      echo "Could not write PDF File"; 
     } 
    } 

Ce que vous devriez faire si cela vous convient:

Ecrivez les fichiers temporaires dossier (peut-être avec une aide de http://php.net/tempnam) ailleurs et peut-être les supprimer après votre processus d'archivage.

Il y a aussi un deuxième problème dans votre code, vous utilisez $ zipfilename pour calculer la longueur du contenu et $ zipname pour lire le fichier et aucune variable pour créer le zip. Comme $ zipfilename et $ zipname ne sont pas définis, cela ne fonctionnera pas.

Vous devez définir $ zipfilename avec un nom de fichier ZIP et également utiliser cette même variable lors de la création du fichier zip.

Exemple:

// a temp filename containing the current unix timestamp 
    $zipfilename = 'temp_' . time() . '.zip'; 

    $zip->open($zipfilename, ZipArchive::CREATE); 
    foreach ($files as $file) { 
     $zip->addFile($file); 
    } 
    $zip->close(); 

    header('Content-Type: application/zip'); 
    header('Content-disposition: attachment; filename=filename.zip'); 
    header('Content-Length: ' . filesize($zipfilename)); 
    readfile($zipfilename);