2010-06-11 86 views
1

我有一個數據庫表,其中包含大量的PDF blob文件。我試圖將所有文件合併到一個ZIP文件中,我可以下載並打印。Zip多個數據庫PDF blob文件

請幫忙!

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

爲什麼不是你當前的代碼工作?你有沒有收到任何錯誤信息? – 2010-06-11 18:07:12

+0

它創建一個空的zip文件。 – Michael 2010-06-11 19:16:06

+0

我想可能是文件路徑/目錄問題?另外,我是否需要blob條目的標題信息? header(「Content-length:$ size」); header(「Content-type:$ type」); header(「Content-Disposition:inline; filename = $ username- $ description.pdf」); – Michael 2010-06-11 19:20:49

回答

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