从PHP调用7z归档错误的项目

时间:2017-11-16 03:03:48

标签: php 7zip

我一直在弄乱这一小时,还没弄清楚为什么它不起作用。我有一个项目,它在临时文件夹(/ temp)中输出3个xlsx和docx文件。我想将它们压缩下载。

问题是每当我执行7z命令时,它会翻转整个项目文件夹(../temp),甚至不只是临时文件夹。我无法弄清楚为什么。如果我回显$command并在PHP的工作目录中运行cmd(无论如何都应该无关紧要,因为我对所有内容使用绝对路径),效果很好。如果我使用相对路径,它也不起作用。

文件名变量$HSModuleFileName等在别处生成,以'.docx'或'.xlsx'结尾

$project_dir = str_replace('\\', '/', preg_replace('/\\|\/$/', '', dirname(dirname(__DIR__)))) . '/';

$FileName = 'output_' . substr($ImportGUID, -8) . '.zip';


$command = '"C:/Program Files/7-Zip/7z.exe" a -tzip "' . $project_dir . 'temp/' . $FileName . '"
    "' . $project_dir . 'temp/' . $HSModuleFileName . '" "' . $project_dir . 'temp/' . $SummaryFileName . '" "' . $project_dir . 'temp/' . $NoInvoiceFileName . '"';



exec($command);

$ command的回声:

"C:/Program Files/7-Zip/7z.exe" a -tzip "D:/Projects/JFC/temp/output_38416fc5.zip" "D:/Projects/JFC/temp/HS_Module_38416fc5.xlsx" "D:/Projects/JFC/temp/Summary_38416fc5.xlsx" "D:/Projects/JFC/temp/NoInvoice_38416fc5.docx"

因此生成的output_38416fc5.zip文件实际上包含整个“D:/ Projects / JFC”文件夹

1 个答案:

答案 0 :(得分:0)

发现它!感谢@ n0rd指出我正确的方向。使用sysinternals Process Monitor我在7z的Process Start事件中看到,命令行参数是

"C:/Program Files/7-Zip/7z.exe" a -tzip "D:/Projects/JFC/temp/output_de75eb91.zip"

没有文件列表。 然后我突然意识到我将命令与PHP代码中的换行符分开,就在文件列表之前,这意味着它也被exec处理为换行符。