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):
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION));
// 检查文件是否已存在
if (file_exists($targetFile)) {
echo "文件已存在";
$uploadOk = 0;
}
// 限制文件大小(5MB)
if ($_FILES["fileToUpload"]["size"] > 5000000) {
echo "文件太大";
$uploadOk = 0;
}
// 允许特定文件格式
$allowedTypes = ["jpg", "png", "jpeg", "gif"];
if (!in_array($imageFileType, $allowedTypes)) {
echo "只允许 JPG, JPEG, PNG & GIF 文件";
$uploadOk = 0;
}
// 检查上传标志并移动文件
if ($uploadOk == 1) {
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "文件上传成功";
} else {
echo "上传失败";
}
}
安全增强措施
增加文件类型验证:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES["fileToUpload"]["tmp_name"]);
finfo_close($finfo);
$allowedMimes = ["image/jpeg", "image/png", "image/gif"];
if (!in_array($mime, $allowedMimes)) {
die("无效的文件类型");
}
重命名上传文件防止覆盖:
$newFileName = uniqid() . '.' . $imageFileType;
$targetFile = $targetDir . $newFileName;
多文件上传实现
HTML表单修改:
<input type="file" name="filesToUpload[]" id="filesToUpload" multiple>
PHP处理脚本修改:
foreach ($_FILES["filesToUpload"]["tmp_name"] as $key => $tmpName) {
$targetFile = $targetDir . basename($_FILES["filesToUpload"]["name"][$key]);
move_uploaded_file($tmpName, $targetFile);
}
错误处理与调试
检查上传错误代码:
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;
// 其他错误处理...
}
}
服务器配置注意事项
确保php.ini中相关设置正确:
file_uploads = On
upload_max_filesize = 20M
post_max_size = 21M
max_file_uploads = 20
创建上传目录并设置权限:
if (!file_exists($targetDir)) {
mkdir($targetDir, 0755, true);
}






