如何改造动态附件上传表单实现多文件重命名并存入数据库?
多附件上传改造方案
1. HTML表单修改
首先需确保表单包含enctype="multipart/form-data"属性(否则无法上传文件),同时补充提交按钮:
<form method="post" enctype="multipart/form-data"> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <h3>上传附件</h3> <div class="input_field"> <table id="table_field" class="table table-bordered"> <tr> <th>附件</th> <th>操作</th> </tr> <tr> <td><input class="form-control" type="file" name="FileToUpload[]" multiple></td> <td><input class="btn btn-primary" type="button" name="add" id="add" value="添加"></td> </tr> </table> </div> <div class="form-group"> <div class="g-recaptcha" data-sitekey="6LeGWochAAAAAJJYH17JqaBlkFJfSoJPvrPr2BI0"></div> <span id="captcha_error" class="text-danger"></span> </div> <button type="submit" class="btn btn-success">提交上传</button> </form>
2. JavaScript逻辑调整
保留原有的添加/删除文件行功能,仅调整文本为中文:
$(document).ready(function() { var html = '<tr><td><input class="form-control" type="file" name="FileToUpload[]" multiple></td><td><input class="btn btn-danger remove" type="button" name="remove" value="删除"></td></tr>'; var max = 10; var x = 1; $("#add").click(function() { if (x < max) { $("#table_field").append(html); x++; } }); $("#table_field").on('click', '.remove', function() { $(this).closest('tr').remove(); x--; }); });
3. PHP多文件上传与数据库存储
重写PHP代码,支持批量文件处理,并将新文件名存入images表:
<?php // 数据库配置(请根据实际环境修改) $servername = "localhost"; $username = "你的数据库用户名"; $password = "你的数据库密码"; $dbname = "你的数据库名"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("数据库连接失败: " . $conn->connect_error); } if ($_SERVER["REQUEST_METHOD"] == "POST") { $target_dir = "uploads/"; // 确保上传目录存在,不存在则创建 if (!file_exists($target_dir)) { mkdir($target_dir, 0755, true); } // 允许的文件类型 $allowed_types = ["jpg", "jpeg", "png", "gif", "pdf"]; $max_file_size = 5000000; // 5MB上限 // 遍历所有上传文件 foreach ($_FILES["FileToUpload"]["tmp_name"] as $key => $tmp_name) { $uploadOk = 1; $original_name = $_FILES["FileToUpload"]["name"][$key]; $file_size = $_FILES["FileToUpload"]["size"][$key]; $file_error = $_FILES["FileToUpload"]["error"][$key]; // 检查文件是否正常上传 if ($file_error !== UPLOAD_ERR_OK) { echo "文件「" . htmlspecialchars($original_name) . "」上传错误,错误码: " . $file_error . "<br>"; $uploadOk = 0; continue; } // 验证文件类型 $file_ext = strtolower(pathinfo($original_name, PATHINFO_EXTENSION)); if (!in_array($file_ext, $allowed_types)) { echo "文件「" . htmlspecialchars($original_name) . "」类型不允许,仅支持JPG/JPEG/PNG/GIF/PDF<br>"; $uploadOk = 0; continue; } // 验证文件大小 if ($file_size > $max_file_size) { echo "文件「" . htmlspecialchars($original_name) . "」过大,最大允许5MB<br>"; $uploadOk = 0; continue; } // 生成唯一新文件名(避免重复) $new_filename = round(microtime(true)) . "_" . uniqid() . "." . $file_ext; $target_file = $target_dir . $new_filename; // 检查目标文件是否重复(概率极低) if (file_exists($target_file)) { echo "文件「" . htmlspecialchars($original_name) . "」上传失败,目标文件已存在<br>"; $uploadOk = 0; continue; } // 移动文件并写入数据库 if ($uploadOk) { if (move_uploaded_file($tmp_name, $target_file)) { echo "文件「" . htmlspecialchars($original_name) . "」上传成功,新文件名: " . $new_filename . "<br>"; // 插入数据库 $stmt = $conn->prepare("INSERT INTO images (filename) VALUES (?)"); $stmt->bind_param("s", $new_filename); if ($stmt->execute()) { echo "文件名已成功存入数据库<br>"; } else { echo "存入数据库失败: " . $conn->error . "<br>"; } $stmt->close(); } else { echo "文件「" . htmlspecialchars($original_name) . "」上传失败<br>"; } } } } $conn->close(); ?>
关键注意事项
- 目录权限:确保
uploads目录拥有服务器写入权限(可设置为chmod 755) - 数据库表结构:
images表需包含id(自增主键)和filename(字符串类型)字段;若需关联申请ID,需额外添加application_id字段并在插入时传入 - 验证码验证:当前代码未处理reCAPTCHA验证,需在PHP中补充验证逻辑
内容的提问来源于stack exchange,提问作者Edrian
相关产品推荐
相关产品推荐

