使用 PHP 从 MySQL 的文件中创建 zip 存档

Create zip archive out of file from MySQL using PHP

我试图在下载前将 XML 文件从 MySQL 数据库放入 zip 存档。我可以创建 zip 文件,但 Windows 打开它时出错。

错误消息:window 无法打开文件夹。 filename.zip无效

这是我的代码:

 <?php

if(isset($_GET['id'])) 
{

    $id  = intval($_GET['id']);


    if($id <= 0) {
        die('The id is invalid!');
    }
    else 
{
        // Connect to the database
        $dbLink = new mysqli('localhost', 'root', 'root', 'db');
        if(mysqli_connect_errno()) {
            die("MySQL connection failed: ". mysqli_connect_error());
        }



 $zip = new ZipArchive();
$filename = "export_".date('Y.m.d H.i').".zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== true)
{
    echo "Cannot Open for writing";
}


$zip->addEmptyDir('Section');

$query = "SELECT name,data FROM file_section WHERE id ='$id'";   
$result = $dbLink->query($query);


 if($result->num_rows == 1) 
     {          
 // Get the row

     $row = mysqli_fetch_array($result);
 }
while($row = mysql_fetch_array($result))
{
    $zip->addFile($row['data'], "{$row['name']}.xml");
}

$zip->close();



    header("Content-disposition: attachment; filename='.$filename'");
    header('Content-type: application/zip');


    readfile($fileName);
    }


            // Free the mysqli resources
            mysqli_free_result($result);
        }
        else {
            echo "Error! Query failed: <pre>{$dbLink->error}</pre>";
        }
        mysqli_close($dbLink);


?>

P.S.: 我的知识有限PHP。

对此进行测试:在 addFile 您的 zip 对象之前创建一个临时文件 见 http://php.net/manual/en/ziparchive.addfile.php

addFile方法等待第一个参数一个文件名(要添加的文件的路径)

这是我后来得到的有效解决方案。对单个文件id输入有效。

<?php
// Make sure an id was passed
if (isset($_GET['ids'])) {
// Get the id into string (in case of an array)
$id_pass = implode(",",$_GET['ids']);
// Make sure the name is in fact a valid
if ($id_pass <= 0) {
    die ('No ID Selected!');
} else

 {
// Connect to the database
    $dbLink = new mysqli('localhost', 'root', 'password', 'DB Name');
    if (mysqli_connect_errno()) {
        die("MySQL connection failed: " . mysqli_connect_error());
    }

        // Fetch the file information
        $query = "select id, name, data from datatable  where id = {$id_pass};";
        $result = $dbLink->query($query);

        if ($result) {
            // Make sure the result is valid
            if ($result->num_rows == 1) {
                // Get the row
                $row = mysqli_fetch_assoc($result);

                //zip function

                $zip = new ZipArchive();
                $filename = "export_" . date('Y.m.d H.i.s') . ".zip";

                if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) !== true) {
                    echo "Cannot Open for writing";
                }


                $ext = $row['name'] . ".xml"; // taking file name from DB and adding extension separately
                $zip->addFromString($ext, $row['data']); //adding blob data from DB
                $zip->close();

             header("Content-disposition: inline; filename='.$filename'");
            header('Content-type: application/zip');
            readfile($filename);
            unlink($filename);
            }
        }

    // Free the mysqli resources     
        mysqli_free_result($result);
         mysqli_close($dbLink);

}
}