表单上传前重命名所选文件的实现问题求助
文件上传前重命名的解决方案
你的核心问题是没有在文件存储路径中使用用户输入的新文件名,原代码始终沿用了上传文件的原始名称。此外还需补充几个关键细节:保留原文件扩展名、处理用户未输入新名称的情况、以及基础安全验证。
修复后的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
相关产品推荐
相关产品推荐

