php 文件上传与下载处理:最佳实践
一、文件上传
(一)HTML 表单设置
在 HTML 中创建表单时,需设置 enctype="multipart/form - data"
,这是文件上传所必需的编码类型。例如:
<form action="upload.php" method="post" enctype="multipart/form - data">
<input type="file" name="myfile">
<input type="submit" value="上传">
</form>
(二)PHP 处理上传
在 PHP 中,使用 $_FILES
超全局变量来处理上传的文件。它是一个关联数组,包含了关于上传文件的各种信息。例如,对于上述表单,$_FILES['myfile']
包含了上传文件的详细信息,如 name
(文件名)、type
(文件类型)、tmp_name
(临时文件名)、error
(错误代码)和 size
(文件大小)。
以下是一个基本的上传处理示例:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$target_dir = "uploads/";
$target_file = $target_dir. basename($_FILES["myfile"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION));
// 检查文件是否已存在
if (file_exists($target_file)) {
echo "文件已存在。";
$uploadOk = 0;
}
// 检查文件大小
if ($_FILES["myfile"]["size"] > 500000) {
echo "文件大小超过限制。";
$uploadOk = 0;
}
// 允许的文件扩展名
$allowed_extensions = array("jpg", "jpeg", "png", "gif");
if (!in_array($imageFileType, $allowed_extensions)) {
echo "仅允许 JPG, JPEG, PNG 和 GIF 文件。";
$uploadOk = 0;
}
if ($uploadOk == 1) {
if (move_uploaded_file($_FILES["myfile"]["tmp_name"], $target_file)) {
echo "文件 ". htmlspecialchars(basename($_FILES["myfile"]["name"])). " 上传成功。";
} else {
echo "上传文件时出错。";
}
}
}
?>
(三)安全性考虑
- 文件类型验证:除了通过扩展名检查,还可以使用
finfo_file
函数来获取文件的真实 MIME 类型,防止恶意用户通过修改扩展名上传危险文件。 - 文件大小限制:不仅在 PHP 中检查,还可以在服务器配置(如 Apache 的
php.ini
)中设置上传文件的最大大小。
二、文件下载
(一)设置 HTTP 头信息
要实现文件下载,需要设置正确的 HTTP 头信息,告诉浏览器这是一个要下载的文件。例如:
<?php
$file = 'example.pdf';
if (file_exists($file)) {
header('Content - type: application/pdf');
header('Content - Disposition: attachment; filename="'. basename($file). '"');
header('Content - Length: '. filesize($file));
readfile($file);
} else {
echo "文件不存在。";
}
?>
(二)安全性与优化
- 防止目录遍历攻击:对用户请求的文件名进行严格的验证和过滤,确保只能下载授权的文件。
- 大文件下载优化:对于大文件,可以使用
fopen
和fread
函数逐块读取并输出,而不是一次性读取整个文件到内存中。
通过以上方法,我们可以在 PHP 中安全、有效地实现文件的上传和下载功能。在实际应用中,还应根据具体需求进行进一步的优化和扩展。
本文链接:https://blog.runxinyun.com/post/468.html 转载需授权!
留言0