php实现文件上传
文件上传基础实现
使用PHP实现文件上传需要结合HTML表单和PHP的文件处理函数。以下是一个基本示例:
HTML表单部分(upload_form.html):
<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):
<?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;
}
// 限制文件大小(例如500KB)
if ($_FILES["fileToUpload"]["size"] > 500000) {
$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 "文件". basename( $_FILES["fileToUpload"]["name"]). "上传成功";
} else {
echo "上传过程中发生错误";
}
}
?>
安全增强措施
确保上传目录不可执行:
// 在uploads目录中放置.htaccess文件
// 内容为:php_flag engine off
重命名上传文件:
$newFileName = uniqid().'.'.$imageFileType;
$targetFile = $targetDir . $newFileName;
验证文件内容:
// 检查文件头是否符合预期类型
$allowedTypes = [
'jpg' => "\xFF\xD8\xFF",
'png' => "\x89\x50\x4E\x47",
'gif' => "GIF"
];
多文件上传实现
HTML表单:
<input type="file" name="filesToUpload[]" id="filesToUpload" multiple>
PHP处理:
foreach ($_FILES["filesToUpload"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["filesToUpload"]["tmp_name"][$key];
$name = basename($_FILES["filesToUpload"]["name"][$key]);
move_uploaded_file($tmp_name, "uploads/$name");
}
}
文件上传配置
php.ini相关设置:
file_uploads = On
upload_max_filesize = 2M
post_max_size = 8M
max_file_uploads = 20
运行时修改配置:
ini_set('upload_max_filesize', '10M');
ini_set('post_max_size', '12M');
错误处理
检查上传错误代码:
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;
// 其他错误处理...
}
}






