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

表单上传前重命名所选文件的实现问题求助

文件上传前重命名的解决方案

你的核心问题是没有在文件存储路径中使用用户输入的新文件名,原代码始终沿用了上传文件的原始名称。此外还需补充几个关键细节:保留原文件扩展名、处理用户未输入新名称的情况、以及基础安全验证。

修复后的upload.php代码

<?php
// 基础验证:检查文件是否成功上传
if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
    echo '文件上传失败,请重试';
    exit;
}

// 获取用户输入的新文件名和原始文件信息
$newFileName = trim($_POST['new_fileName']);
$originalName = $_FILES['file']['name'];
$tmpFilePath = $_FILES['file']['tmp_name'];

// 提取原始文件的扩展名
$fileExt = pathinfo($originalName, PATHINFO_EXTENSION);

// 确定最终文件名:如果用户输入了新名称则使用,否则用原始名称
if (!empty($newFileName)) {
    // 安全处理:过滤非法字符,防止路径遍历
    $finalFileName = preg_replace('/[^\w\-.]/', '', $newFileName);
    // 如果用户没加扩展名,自动补上原扩展名
    if (strpos($finalFileName, '.') === false && !empty($fileExt)) {
        $finalFileName .= '.' . $fileExt;
    }
} else {
    $finalFileName = $originalName;
}

// 定义存储路径
$uploadDir = 'upload/';
// 确保上传目录存在,不存在则创建
if (!is_dir($uploadDir)) {
    mkdir($uploadDir, 0755, true);
}
$finalLocation = $uploadDir . $finalFileName;

// 移动上传文件到目标路径
if (move_uploaded_file($tmpFilePath, $finalLocation)) {
    echo "文件已成功上传并命名为:{$finalFileName}";
} else {
    echo '文件存储失败,请检查目录权限';
}
?>

关键修改点说明

  • 启用新文件名:将存储路径替换为包含用户输入的新名称(或处理后的最终名称),不再使用原始文件名
  • 保留文件格式:通过pathinfo提取原始文件扩展名,避免用户输入新名称时丢失文件格式
  • 安全过滤:用正则表达式过滤文件名中的非法字符,防止路径遍历攻击
  • 空值兼容:当用户未输入新名称时,自动 fallback 到原始文件名
  • 目录保障:提前检查并创建上传目录,避免因目录缺失导致上传失败
  • 上传校验:先确认文件上传状态,避免后续代码因无效文件报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:50:36