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 处理上传
在服务器端,通过 PHP 的 $_FILES 超全局变量处理上传的文件。检查文件是否存在错误,并获取文件的相关信息。
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
文件验证 对上传的文件进行验证,包括检查文件是否为真实的图片(如果是图片上传)、文件大小限制和文件类型限制。
$check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
if ($check !== false) {
echo "File is an image - " . $check["mime"] . ".";
$uploadOk = 1;
} else {
echo "File is not an image.";
$uploadOk = 0;
}
if ($_FILES["fileToUpload"]["size"] > 500000) {
echo "Sorry, your file is too large.";
$uploadOk = 0;
}
if ($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif") {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
保存文件 如果所有验证通过,将文件从临时目录移动到目标目录。

if ($uploadOk == 0) {
echo "Sorry, your file was not uploaded.";
} else {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "The file " . htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
安全注意事项
防止文件覆盖 检查目标文件是否已存在,避免覆盖现有文件。
if (file_exists($targetFile)) {
echo "Sorry, file already exists.";
$uploadOk = 0;
}
限制文件类型 明确指定允许上传的文件类型,防止上传恶意文件。
$allowedTypes = ["jpg", "png", "jpeg", "gif"];
if (!in_array($imageFileType, $allowedTypes)) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
$uploadOk = 0;
}
设置文件大小限制
在 PHP 配置中设置 upload_max_filesize 和 post_max_size,确保服务器能够处理大文件上传。

upload_max_filesize = 2M
post_max_size = 3M
高级功能
生成唯一文件名 避免文件名冲突,使用唯一标识符生成新的文件名。
$newFileName = uniqid() . '.' . $imageFileType;
$targetFile = $targetDir . $newFileName;
图片处理 使用 GD 库或 Imagick 对上传的图片进行缩放、裁剪或添加水印等处理。
$image = imagecreatefromjpeg($targetFile);
$newImage = imagescale($image, 200, 200);
imagejpeg($newImage, $targetDir . "thumbnail_" . $newFileName);
imagedestroy($image);
imagedestroy($newImage);
错误处理 捕获并处理上传过程中可能出现的错误,提供用户友好的错误信息。
if ($_FILES["fileToUpload"]["error"] > 0) {
switch ($_FILES["fileToUpload"]["error"]) {
case UPLOAD_ERR_INI_SIZE:
echo "The uploaded file exceeds the upload_max_filesize directive in php.ini.";
break;
case UPLOAD_ERR_FORM_SIZE:
echo "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.";
break;
// 其他错误处理...
}
}






