压缩多个数据库PDF blob文件

时间:2010-06-11 17:12:31

标签: php mysql database zip blob

我有一个包含大量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 个答案:

答案 0 :(得分: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";
        }
    }

如果适合您,您应该怎么做:

将文件写入临时文件夹(可能在http://php.net/tempnam的某些帮助下)在其他地方写入,并在归档过程后将其删除。

您的代码中还存在第二个问题,您使用$ zipfilename来计算内容长度,使用$ zipname来读取文件而不使用变量来创建zip。由于未定义$ zipfilename和$ zipname,因此无效。

您应该使用ZIP文件名定义$ zipfilename,并在创建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); 

答案 1 :(得分:0)

pdftk将合并多个PDF文件以及PDFsam ..