# PHP中$_FILES怎么使用 ## 一、$_FILES概述 在PHP中,`$_FILES`是一个超全局数组,专门用于处理通过HTTP POST方法上传的文件。当HTML表单设置`enctype="multipart/form-data"`属性时,上传的文件信息会自动存储在这个数组中。 ### 基本特点: - 二维关联数组结构 - 每个上传文件包含5个关键信息 - 仅在文件上传请求中有效 ## 二、$_FILES数组结构 一个典型的上传文件在`$_FILES`中表现为: ```php $_FILES = [ 'file_field' => [ 'name' => 'example.jpg', // 原始文件名 'type' => 'image/jpeg', // MIME类型 'tmp_name' => '/tmp/php3hU2tW', // 服务器临时路径 'error' => 0, // 错误代码 'size' => 10240 // 文件大小(字节) ] ];
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="userfile"> <input type="submit" value="上传"> </form>
<?php // 检查文件是否上传成功 if ($_FILES['userfile']['error'] !== UPLOAD_ERR_OK) { die("上传失败: " . $_FILES['userfile']['error']); } // 安全验证 $allowed_types = ['image/jpeg', 'image/png']; if (!in_array($_FILES['userfile']['type'], $allowed_types)) { die("只允许上传JPEG/PNG图片"); } // 限制文件大小(2MB以内) $max_size = 2 * 1024 * 1024; if ($_FILES['userfile']['size'] > $max_size) { die("文件大小超过2MB限制"); } // 生成唯一文件名 $ext = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION); $new_filename = uniqid() . '.' . $ext; $upload_path = 'uploads/' . $new_filename; // 移动临时文件到永久目录 if (move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_path)) { echo "文件上传成功!保存为: " . htmlspecialchars($new_filename); } else { echo "文件保存失败"; } ?>
$_FILES['field']['error']
可能的值:
常量 | 值 | 说明 |
---|---|---|
UPLOAD_ERR_OK | 0 | 上传成功 |
UPLOAD_ERR_INI_SIZE | 1 | 超过php.ini的upload_max_filesize限制 |
UPLOAD_ERR_FORM_SIZE | 2 | 超过表单MAX_FILE_SIZE限制 |
UPLOAD_ERR_PARTIAL | 3 | 只有部分文件被上传 |
UPLOAD_ERR_NO_FILE | 4 | 没有文件被上传 |
UPLOAD_ERR_NO_TMP_DIR | 6 | 找不到临时文件夹 |
UPLOAD_ERR_CANT_WRITE | 7 | 写入磁盘失败 |
UPLOAD_ERR_EXTENSION | 8 | PHP扩展阻止了上传 |
永远不要信任客户端数据:
is_uploaded_file()
和move_uploaded_file()
$_FILES['type']
)文件类型验证建议:
$finfo = finfo_open(FILEINFO_MIME_TYPE); $mime = finfo_file($finfo, $_FILES['file']['tmp_name']); finfo_close($finfo);
文件重命名策略:
目录安全:
.htaccess
限制访问: php_flag engine off deny from all
HTML表单:
<input type="file" name="files[]" multiple>
PHP处理:
foreach ($_FILES['files']['tmp_name'] as $key => $tmp_name) { // 处理每个文件 $name = $_FILES['files']['name'][$key]; // ...其他处理逻辑 }
修改php.ini配置:
upload_max_filesize = 50M post_max_size = 55M max_execution_time = 300
使用session.upload_progress
:
ini_set('session.upload_progress.enabled', true); ini_set('session.upload_progress.name', 'upload_progress');
文件上传大小限制:
upload_max_filesize
和post_max_size
post_max_size
> upload_max_filesize
临时目录不可写:
sys_get_temp_dir()
返回值upload_tmp_dir
有写权限中文文件名乱码:
$filename = mb_convert_encoding($_FILES['file']['name'], 'UTF-8', 'auto');
$_FILES
是PHP文件上传的核心机制,正确使用需要注意: - 严格的安全验证流程 - 完善的错误处理 - 合理的服务器配置 - 规范的文件命名和存储策略
通过本文介绍的方法,您可以构建安全可靠的文件上传功能,满足各种Web应用场景的需求。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。