📜  为什么将文件上传到PHP时 $_FILES 为空?(1)

📅  最后修改于: 2023-12-03 14:48:56.510000             🧑  作者: Mango

为什么将文件上传到 PHP 时 $_FILES 为空?

当我们在 PHP 中使用文件上传功能时,可能会遇到 $_FILES 数组为空的情况。这个问题可能来自于多个方面,下面我将说明一些可能的原因。

1. enctype 属性

在 HTML 表单中,我们需要指定 enctype 属性的值为 "multipart/form-data",否则 $_FILES 数组将为空。这是由于文件上传需要使用多部分表单数据格式。

<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="myfile">
  <input type="submit" value="Upload">
</form>
2. 文件大小限制

PHP 中有一些常见的文件大小限制,如 post_max_size、upload_max_filesize、max_file_uploads 等。如果上传的文件大小超出了这些限制,$_FILES 数组将为空。

// 设置文件大小限制为 5MB
ini_set('post_max_size', '5M');
ini_set('upload_max_filesize', '5M');
3. 文件上传临时目录

当我们上传文件到服务器时,服务器会将上传的文件存储在一个临时的文件夹中。如果我们在 PHP 脚本中没有将上传的文件移动到正确的目录中,$_FILES 数组也会为空。

$upload_dir = 'uploads/';
$uploaded_file = $upload_dir . basename($_FILES['myfile']['name']);

if (move_uploaded_file($_FILES['myfile']['tmp_name'], $uploaded_file)) {
  echo "File is valid, and was successfully uploaded.\n";
} else {
  echo "Possible file upload attack!\n";
}
4. 文件名冲突

有时候上传的文件可能有重名,这时候我们可以使用一些类似于加时间戳等的方式来避免文件名冲突。

$upload_dir = 'uploads/';
$uploaded_file = $upload_dir . time() . '-' . basename($_FILES['myfile']['name']);

if (move_uploaded_file($_FILES['myfile']['tmp_name'], $uploaded_file)) {
  echo "File is valid, and was successfully uploaded.\n";
} else {
  echo "Possible file upload attack!\n";
}
总结

在 PHP 中使用文件上传功能时,我们需要确保 enctype 属性设置正确,文件大小符合限制,上传临时目录正确,文件名无冲突。如果还是遇到了 $_FILES 数组为空的问题,我们可以检查一下 PHP 的错误日志,看看是否有关于文件上传的报错信息。