【问题标题】:Zip multiple database PDF blob files压缩多个数据库 PDF blob 文件
【发布时间】:2010-06-11 17:12:30
【问题描述】:

我有一个包含大量 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();


    ?>

【问题讨论】:

  • 为什么您当前的代码不起作用?您收到任何错误消息吗?
  • 它会创建一个空的 zip 文件。
  • 我认为可能是文件路径/目录问题?另外,我需要 blob 条目的标头信息吗? header("内容长度:$size"); header("内容类型:$type"); header("Content-Disposition: inline; filename=$username-$description.pdf");
  • 你好小鲍比-bobby-tables.com

标签: php mysql database zip blob


【解决方案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); 

【讨论】:

    【解决方案2】:

    pdftk会合并多个PDF文件,还有PDFsam..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-06
      • 2017-04-18
      相关资源
      最近更新 更多