如何将复选框数组添加到zip文件中以便从表单下载


How to add checkbox array to zip file for download from a form

我正试图获得一个foreach循环,以便从我的表单中为我提供复选框值(具有值的文件名),并将其添加到zip文件中。

<input type="checkbox" name="download[0]" value="Fact_Sheet_1.pdf" />
<input type="checkbox" name="download[1]" value="Fact_Sheet_2.pdf" />
<input type="checkbox" name="download[2]" value="Fact_Sheet_3.pdf" />
<input type="checkbox" name="download[3]" value="Fact_Sheet_4.pdf" />
<input type="checkbox" name="download[4]" value="Fact_Sheet_5.pdf" />

如果我点击一个复选框,效果很好,但当我勾选多个复选框时,只有一个文件会添加到zip文件中。

我的代码在下面。如有任何建议,我们将不胜感激。

if(isset($_POST['submit']) )
    {
    foreach ($_POST['download'] as $key => $val) {
        $filename = 'Fact_Sheets/' . $val;
        }
    }
system("zip -r files/zipfile  $filename"); 
foreach ($_POST['download'] as $key => $val) {
    $filename = 'Fact_Sheets/' . $val;
}
system("zip -r files/zipfile  $filename"); 

每次都覆盖$filename

相反,建立它:

$filenames = '';
foreach ($_POST['download'] as $key => $val) {
    $filenames .= '"Fact_Sheets/' . $val . '" ';
}
system("zip -r files/zipfile  $filenames");

(还要注意的是,将input命名为类似"download[]"的名称是惯例,这样索引就可以自动为您完成。不过,这并不重要。)


但是不要这样做。正如评论中所讨论的,它有一个GAPING FLAW。不要写这些代码,即使你"只是在测试",或者即使你会"稍后修复"。一开始就不要让它存在,否则你会犯错误,或者不小心把它留在原地,或者找不到时间好好做。

我认为不写这个答案并不是在鼓励你,但我得出结论,如果我允许接受其他答案,这可能是一个危险的答案,会让事情变得更糟

一开始您使用的是$filename =而不是$filename .=(变量名应该是$filenames

如果你不检查文件是否存在并且不包含无效字符,我可能会伪造请求并发送给你:download[8]=../../../../../../../../etc/passwd

所以你的整个代码应该是这样的:

if(isset($_POST['submit']) ) {
    $filenames = array();
    foreach ($_POST['download'] as $key => $val) {
        if( basename( $val) != $val){
          throw new Exception( 'Hacker attempt!');
        }
        $filename = 'Fact_Sheets/' . $val;
        if( !file_exists( $filename)){
          throw new Exception( 'Invalid file!');
        }
        $filenames[] = escapeshellarg( $filename);
    }
    if( count( $filenames)){
         system("zip -r files/zipfile " . implode( ' ', $filenames)); 
    }
}

是的,没错,你也应该使用擒纵器。想象一下:

download[8]=`rm -rf *`

为什么不使用phpzip库?

将代码更改为以下代码:

<input type="checkbox" name="download[]" value="Fact_Sheet_1.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_2.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_3.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_4.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_5.pdf" />