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

如何改造动态附件上传表单实现多文件重命名并存入数据库?

多附件上传改造方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:09:19