php实现文件上传
PHP 文件上传实现方法
在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤:
创建 HTML 表单
使用 enctype="multipart/form-data" 属性确保文件可以正确上传:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload" id="fileToUpload">
<input type="submit" value="Upload File" name="submit">
</form>
处理上传的 PHP 脚本
在 upload.php 文件中处理上传逻辑:

$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查文件是否为真实图片(可选)
if(isset($_POST["submit"])) {
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if($check !== false) {
$uploadOk = 1;
} else {
$uploadOk = 0;
}
}
// 检查文件是否已存在
if (file_exists($targetFile)) {
$uploadOk = 0;
}
// 限制文件大小(例如 5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
$uploadOk = 0;
}
// 允许特定文件格式
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
$uploadOk = 0;
}
// 检查上传标志并尝试上传文件
if ($uploadOk == 0) {
echo "文件未上传。";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "文件 ". htmlspecialchars(basename($_FILES["fileToUpload"]["name"])). " 已上传。";
} else {
echo "上传文件时出错。";
}
}
安全注意事项
确保上传目录不可执行脚本:
// 在 uploads 目录中放置 .htaccess 文件
// 内容为:php_flag engine off
验证文件类型时不要依赖 $_FILES['file']['type'],因为它可以被伪造。应使用 pathinfo() 或 mime_content_type()。

限制上传文件扩展名:
$allowed = ['jpg', 'png', 'gif'];
if(!in_array($imageFileType, $allowed)) {
$uploadOk = 0;
}
错误处理
检查上传过程中的错误代码:
if ($_FILES['fileToUpload']['error'] !== UPLOAD_ERR_OK) {
switch($_FILES['fileToUpload']['error']) {
case UPLOAD_ERR_INI_SIZE:
echo "文件大小超过服务器限制";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "文件大小超过表单限制";
break;
// 其他错误处理...
}
}
文件重命名
为避免文件名冲突,可以生成唯一文件名:
$newFileName = uniqid().'.'.$imageFileType;
$targetFile = $targetDir . $newFileName;
以上方法提供了 PHP 文件上传的基本实现,可根据实际需求调整安全策略和功能扩展。



