2010-06-11 24 views
1

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

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

<?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

Почему ваш текущий код работает? Вы получаете сообщения об ошибках? –

+0

Создает zip-файл, который пуст. – Michael

+0

Я думаю, что это может быть проблема с файлом/каталогом? Кроме того, нужна ли информация заголовка для записей blob? header ("Content-length: $ size"); Заголовок («Тип содержимого: тип $»); header («Content-Disposition: inline; filename = $ username- $ description.pdf»); – Michael

ответ

1

Ваши данные 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"; 
     } 
    } 

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

Напишите файлы во временной складке er (возможно, с помощью 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);