У меня есть таблица базы данных, содержащая многочисленные 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(); ?>
Ваши данные PDF хранятся в базе данных в 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);
pdftk объединит несколько файлов PDF, а также PDFsam ..