如何实现勾选复选框批量同时下载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>
解决方案
一、修正前端表单问题
- 替换批量下载按钮
原按钮是<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>
- 修复复选框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">
- 可选:添加全选/取消全选功能
在页面底部添加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
相关产品推荐
相关产品推荐

