收集由另一个PHP脚本发送的文件附件,并将其输出为ZIP文件夹

 收藏

我目前有一个PHP脚本,可以根据发票的ID号将有关发票的数据导出到CSV文件中。该文件是动态生成的,不会保存在服务器上。更具体地说,我在回显行,并设置以下标头,以使这些回显出现在文件附件中:

header('Content-type: text/plain');
header("Content-Disposition: attachment; filename=INV${id}.csv");

我可以调用脚本的方式是使用:

my_script.php?id=123

但是,现在,我需要编写一个脚本,以获取给定日期的所有发票,获取其对应的CSV文件,然后将它们作为ZIP文件下载到客户端。我可以使用已经存在的输出一个文件的脚本来做到这一点吗?

我正在考虑的是从数据库中获取所有相关发票ID的列表(例如123、456和789),然后遍历它们并为每个ID调用我的脚本,例如:

my_script.php?id=123 //then 456, then 789

然后将文件结果保存到数组中。

到目前为止我的尝试:

So far, I tried saving one resulting file as a variable as per this answer, but the variable remains empty (while the already existing script does return a non-empty file):

$file = getScriptOutput("my_script.php?id=123");
echo $file;

function getScriptOutput($path, $print = FALSE)
{
    ob_start();

    if( is_readable($path) && $path )
    {
        include $path;
    }
    else
    {
        return FALSE;
    }

    if( $print == FALSE )
        return ob_get_clean();
    else
        echo ob_get_clean();
}

因此,这里有两个问题:

1-如何制作一个文件数组,每个文件都是PHP脚本的文件结果(附加)?

2-如何将所有这些动态文件合并到PHP中的一个ZIP文件中?

编辑:建议的副本确实有助于压缩部分,但是我需要知道如何获取PHP脚本的文件附件(由于存储和安全问题,有没有一种方法可以不将文件保存在服务器上?)。

回复
  • svelit 回复

    好吧,我重新考虑了自己的计划,最终我追求了以下目标:

    对于每个ID:

    • Read the attachment of the http response coming from my_script.php?id=123 and saving it into a variable as per this answer (using cURL and setting CURLOPT_BINARYTRANSFER => TRUE)
    • Create a temporary file and writing in it the varaible's data (typical fopen and fwrite did the job)
    • Add the file to the ZIP archive, as per @DigitalJedi's answer
    • After sending the ZIP, delete the temporary file using unlink("filename.csv").

  • uqui 回复

    您可以将所有文件保存在某个位置,然后访问它们并将其放入一个zip文件中,如下所示:

    $zip = new ZipArchive;
    if ($zip->open('test_new.zip', ZipArchive::CREATE) === TRUE)
    {
        // Add files to the zip file
        $zip->addFile('test.txt');
        $zip->addFile('test.pdf');
    
        // All files are added, so close the zip file.
        $zip->close();
    }