答案:PHP文件上传需配置表单enctype、调整php.ini中upload_max_filesize、post_max_size等参数,通过PHP脚本处理文件并验证类型、大小、名称,生成唯一文件名存入安全目录,防止覆盖与执行,显示时通过安全脚本读取并输出文件内容,防范XSS与CSRF攻击。

直接说吧,PHP实现文件上传,核心在于HTML表单设置、PHP配置调整以及服务端脚本处理。看似简单,实则坑不少,比如文件大小限制、类型验证、安全漏洞等等。
文件上传功能完整代码示例
<?php
// 错误处理函数
function handle_upload_error($error_code) {
$messages = [
UPLOAD_ERR_OK => '文件上传成功',
UPLOAD_ERR_INI_SIZE => '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值',
UPLOAD_ERR_FORM_SIZE => '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值',
UPLOAD_ERR_PARTIAL => '文件只有部分被上传',
UPLOAD_ERR_NO_FILE => '没有文件被上传',
UPLOAD_ERR_NO_TMP_DIR => '找不到临时文件夹',
UPLOAD_ERR_CANT_WRITE => '文件写入失败',
UPLOAD_ERR_EXTENSION => '由于 PHP 扩展程序中断了文件上传'
];
return isset($messages[$error_code]) ? $messages[$error_code] : '未知上传错误';
}
// 文件上传处理脚本
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 检查是否有文件上传
if (isset($_FILES["uploadedFile"]) && $_FILES["uploadedFile"]["error"] == UPLOAD_ERR_OK) {
$file_name = $_FILES["uploadedFile"]["name"];
$file_tmp_name = $_FILES["uploadedFile"]["tmp_name"];
$file_size = $_FILES["uploadedFile"]["size"];
$file_type = $_FILES["uploadedFile"]["type"];
// 文件类型验证(白名单)
$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($file_type, $allowed_types)) {
die("错误:不允许的文件类型。");
}
// 文件大小限制(单位:字节)
$max_file_size = 204800; // 200KB
if ($file_size > $max_file_size) {
die("错误:文件大小超过限制。");
}
// 目标目录(确保目录存在且可写)
$upload_dir = "uploads/";
if (!is_dir($upload_dir)) {
mkdir($upload_dir, 0777, true); // 创建目录,权限根据实际情况调整
}
// 生成唯一文件名,避免覆盖
$new_file_name = uniqid() . "_" . $file_name;
$destination = $upload_dir . $new_file_name;
// 移动上传的文件到目标目录
if (move_uploaded_file($file_tmp_name, $destination)) {
echo "文件上传成功! 存储在: " . $destination;
} else {
echo "文件上传失败。";
}
} else {
// 处理上传错误
$error_code = isset($_FILES["uploadedFile"]["error"]) ? $_FILES["uploadedFile"]["error"] : UPLOAD_ERR_NO_FILE;
echo "上传错误: " . handle_upload_error($error_code);
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>文件上传示例</title>
</head>
<body>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post" enctype="multipart/form-data">
选择要上传的文件:
<input type="file" name="uploadedFile" id="uploadedFile">
<input type="submit" value="上传文件" name="submit">
</form>
</body>
</html>如何配置php.ini以支持大文件上传?
首先,找到你的
php.ini
php.ini-development
php.ini-production
php.ini
立即学习“PHP免费学习笔记(深入)”;
然后,编辑
php.ini
upload_max_filesize
upload_max_filesize = 50M
post_max_size
upload_max_filesize
upload_max_filesize
post_max_size
post_max_size = 60M
memory_limit
post_max_size
memory_limit = 128M
max_execution_time
max_execution_time = 300
max_input_time
max_input_time = 300
修改完成后,保存
php.ini
PHP文件上传的安全问题有哪些?如何防范?
安全问题简直是重中之重。
$_FILES["uploadedFile"]["type"]
.jpg
.png
php.ini
upload_max_filesize
post_max_size
.php
uniqid()
.htaccess
uniqid()
time()
如何显示上传的文件?
显示上传的文件,这又涉及到存储路径和访问权限的问题。
确定存储路径:首先,你需要知道文件存储在服务器上的哪个目录。 这通常是在你的PHP上传脚本中定义的
$upload_dir
创建访问链接:你需要创建一个URL,用户可以通过这个URL访问上传的文件。 这个URL通常指向一个PHP脚本,该脚本负责读取文件并将其发送给浏览器。
编写PHP脚本:创建一个PHP脚本(例如
get_image.php
<?php
// get_image.php
$upload_dir = "uploads/"; // 你的上传目录
$filename = $_GET['filename']; // 从URL获取文件名
// 安全检查:验证文件名是否合法,防止目录遍历攻击
$safe_filename = basename($filename); // 移除路径信息,只保留文件名
$filepath = $upload_dir . $safe_filename;
if (file_exists($filepath)) {
// 设置Content-Type,根据文件类型设置
$file_extension = strtolower(pathinfo($filepath, PATHINFO_EXTENSION));
switch ($file_extension) {
case "jpg":
case "jpeg":
header('Content-Type: image/jpeg');
break;
case "png":
header('Content-Type: image/png');
break;
case "gif":
header('Content-Type: image/gif');
break;
default:
header('Content-Type: application/octet-stream'); // 未知类型,强制下载
break;
}
// 读取文件并输出
readfile($filepath);
} else {
// 文件不存在,显示错误信息
header('HTTP/1.0 404 Not Found');
echo "文件不存在";
}
?><img>
<img src="get_image.php?filename=<?php echo $filename; ?>" alt="Uploaded Image">
其中
$filename
get_image.php
basename()
这样,你就可以在网页上显示上传的文件了。记住,安全性是第一位的!
以上就是php中如何实现文件上传 php文件上传功能完整代码示例的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号