php 实现文件上传
实现文件上传的基本步骤
在PHP中实现文件上传需要处理HTML表单、服务器端文件接收及安全验证。
HTML表单设置
创建一个包含文件上传字段的表单,确保enctype属性为multipart/form-data:
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="fileToUpload">
<input type="submit" value="Upload">
</form>
PHP接收文件
在upload.php中通过$_FILES超全局数组获取上传文件信息:
$targetDir = "uploads/";
$targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
安全验证与处理
检查文件类型
通过mime_content_type或文件扩展名限制允许的文件类型:

$allowedTypes = ["image/jpeg", "image/png"];
$fileType = $_FILES["fileToUpload"]["type"];
if (!in_array($fileType, $allowedTypes)) {
die("Invalid file type.");
}
防止文件名冲突 使用唯一ID重命名文件避免覆盖:
$newFileName = uniqid() . '.' . pathinfo($targetFile, PATHINFO_EXTENSION);
$targetFile = $targetDir . $newFileName;
移动临时文件
使用move_uploaded_file将文件从临时目录转移到目标位置:

if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
echo "File uploaded successfully.";
} else {
echo "Upload failed.";
}
高级安全措施
设置文件大小限制 在php.ini中配置或通过脚本检查:
$maxSize = 2 * 1024 * 1024; // 2MB
if ($_FILES["fileToUpload"]["size"] > $maxSize) {
die("File too large.");
}
病毒扫描集成 对上传文件调用安全扫描API:
// 示例调用ClamAV扫描
exec("clamscan --quiet " . escapeshellarg($targetFile), $output, $returnCode);
if ($returnCode !== 0) {
unlink($targetFile);
die("Malicious file detected.");
}
错误处理机制
捕获并处理常见上传错误:
switch ($_FILES["fileToUpload"]["error"]) {
case UPLOAD_ERR_INI_SIZE:
die("Exceeds php.ini size limit");
case UPLOAD_ERR_FORM_SIZE:
die("Exceeds form size limit");
case UPLOAD_ERR_PARTIAL:
die("Partial upload");
case UPLOAD_ERR_NO_FILE:
die("No file selected");
}
通过以上方法可实现安全可靠的PHP文件上传功能,注意根据实际需求调整安全策略和存储路径。






