You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现勾选复选框批量同时下载PDF文件?

实现勾选复选框批量下载多个PDF文件

当前只能单独点击每条数据的Download按钮下载对应PDF,需要新增批量下载功能,通过勾选复选框后点击按钮同时下载多个文件。

现有单文件下载按钮代码

<td><a href="print_voucher.php?em_id=<?php echo $row['voucher_id'] ?>" download="print_voucher.php?em_id=<?php echo $row['voucher_id'] ?>"> Download </a></td>

现有完整表格代码

<form action="createzip.php" method="post">
    <table id="selection_table" class="data-table table stripe hover nowrap">
        <thead>
            <tr>
                <div class="col-md-6">
                </div>
                <div class="col-md-1">
                </div>
                <div class="col-md-2">
                </div>
                <div class="col-md-3 pd-10 text-center">
                    <a class="btn btn-primary" name="createzip" id="createzip" value="createzip"> DOWNLOAD ALL </a>
                </div>
            </tr>
            <tr>
                <th class="table-plus datatable-nosort"> <input id="select_all" style="max-height: 20px; max-width: 20px;" type="checkbox" class="form-control" value="Select All"/> <p> Select All </p></th>
                <th> COMPANY NAME </th>
                <th> EMPLOYEE NAME </th>
                <th> DOWNLOAD LINK </th>
            </tr>
        </thead>
        <tbody>
            <tr>

                <?php
                
                    $sql = "SELECT * FROM vouchers WHERE voucher_id BETWEEN '$empID' AND '$endEmpID'";
                    $query = mysqli_query($conn, $sql) or die(mysqli_error());
                    while ($row = mysqli_fetch_array($query)) {
                    $id = $row['voucher_id'];
                 ?>  

                <td class="table-plus">
                    <input style="max-height: 20px; max-width: 20px;" name="fieldid[]" id="checkbox<?php echo $row['voucher_id'] ?>" value="<?php $row['voucher_id'] ?>" type="checkbox" class="form-control">
                </td>
                <td><?php echo $row['paid_by']; ?></td>
                <td><?php echo $row['paid_by']; ?></td>
                <td><a href="print_voucher.php?em_id=<?php echo $row['voucher_id'] ?>" download="print_voucher.php?em_id=<?php echo $row['voucher_id'] ?>"> Download </a></td>

            </tr>
            <?php }?>
        </tbody>
    </table>
</form>

解决方案

一、修正前端表单问题

  1. 替换批量下载按钮
    原按钮是<a>标签无法提交表单,改成提交按钮:
<div class="col-md-3 pd-10 text-center">
    <button type="submit" class="btn btn-primary" name="createzip" id="createzip"> DOWNLOAD ALL </button>
</div>
  1. 修复复选框value输出
    原复选框未输出voucher_id,补充echo:
<input style="max-height: 20px; max-width: 20px;" name="fieldid[]" id="checkbox<?php echo $row['voucher_id'] ?>" value="<?php echo $row['voucher_id'] ?>" type="checkbox" class="form-control">
  1. 可选:添加全选/取消全选功能
    在页面底部添加JS代码,方便批量选择:
<script>
document.getElementById('select_all').addEventListener('change', function() {
    const checkboxes = document.querySelectorAll('input[name="fieldid[]"]');
    checkboxes.forEach(checkbox => {
        checkbox.checked = this.checked;
    });
});
</script>

二、后端createzip.php实现打包下载

核心逻辑是接收选中的ID,生成对应PDF并打包成ZIP输出:

<?php
// 复用你的数据库连接配置
$conn = mysqli_connect("localhost", "用户名", "密码", "数据库名");

if(isset($_POST['createzip']) && !empty($_POST['fieldid'])) {
    // 检查ZIP扩展是否启用
    if(!extension_loaded('zip')) {
        die("ZIP扩展未启用,请联系服务器管理员");
    }

    $zip = new ZipArchive();
    $zipFileName = "vouchers_" . date('YmdHis') . ".zip";
    
    // 创建临时ZIP文件
    if($zip->open($zipFileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
        die("无法创建ZIP文件");
    }

    // 遍历选中的凭证ID
    foreach($_POST['fieldid'] as $voucherId) {
        // 过滤非法输入,防止SQL注入
        $voucherId = mysqli_real_escape_string($conn, $voucherId);
        
        // 获取PDF内容
        $pdfContent = file_get_contents("print_voucher.php?em_id=" . $voucherId);
        
        if($pdfContent) {
            // 自定义PDF文件名
            $pdfFileName = "voucher_" . $voucherId . ".pdf";
            $zip->addFromString($pdfFileName, $pdfContent);
        }
    }

    $zip->close();

    // 输出ZIP文件供下载
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="' . basename($zipFileName) . '"');
    header('Content-Length: ' . filesize($zipFileName));
    readfile($zipFileName);

    // 删除临时ZIP文件
    unlink($zipFileName);
    exit;
} else {
    die("请至少选择一个文件");
}
?>

三、注意事项

  • 确保服务器已启用zip扩展(可通过phpinfo()查看)
  • print_voucher.php需正确输出PDF内容(设置Content-Type: application/pdf响应头)
  • 代码已做SQL注入防护,避免恶意输入风险
  • 临时ZIP文件会在下载完成后自动删除,不占用服务器存储

内容的提问来源于stack exchange,提问作者Bonginkosi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:40:29