Zip несколько файлов базы данных PDF BLOB-файлов - PullRequest
1 голос
/ 11 июня 2010

У меня есть таблица базы данных, которая содержит множество PDF-файлов BLOB-объектов.Я пытаюсь объединить все файлы в один ZIP-файл, который я могу загрузить, а затем распечатать.

Пожалуйста, помогите!

<?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();


    ?>

Ответы [ 2 ]

1 голос
/ 12 июня 2010

Ваши данные PDF хранятся в базе данных в полях BLOB, я не вижу, чтобы вы помещали эти данные в файл.Таким образом, ваш ZIP не будет содержать никаких файлов, потому что вы не добавите в него реально существующие файлы.

Вот что вы сейчас делаете:

  • Чтение ваших данных из базы данных
  • Создание массива имен файлов
  • Создание ZIP файлов с именами, которые могут не существовать

Это то, что вы должны сделать:

  • Чтениеваши данные из базы данных
  • Создание массива имен файлов
  • Запись данных BLOB в эти файлы
  • Создание ZIP-файлов из существующих

Пример:

    $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";
        }
    }

Что вы должны сделать, если это работает для вас:

Записать файлы во временную папку (возможно, с помощью http://php.net/tempnam) где-нибудь еще ивозможно, удалите их после процесса архивирования.

Существует также вторая проблема в вашем коде: вы используете $ zipfilename для расчета длины содержимого и $ zipname для чтения файла, а не переменную для создания zip.$ zipfilename и $ zipname не определеныНед, это не сработает.

Вы должны определить $ zipfilename с именем файла ZIP и также использовать эту же переменную при создании zip-файла.

Пример:

    // 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); 
0 голосов
/ 11 июня 2010

pdftk объединит несколько файлов PDF, а также PDFsam ..

...