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

2022-08-30 06:37:43

我在我的Windows 7计算机上安装了WampServer 2。我使用的是Apache 2.2.11和PHP 5.2.11。当我尝试从表单上传任何文件时,它似乎上传,但在PHP中,数组是空的。文件夹中没有文件。我已配置为允许文件上传等。该文件夹对当前用户具有读/写权限。我很困惑。$_FILESc:\wamp\tmpphp.initmp

网页:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <form enctype="multipart/form-data" action="vanilla-upload.php" method="POST">
        Choose a file to upload: <input name="uploadedfile" type="file" /><br />
        <input type="submit" value="Upload File" />
    </form>
</body>
</html>

菲律宾比索:

<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>

答案 1

以下是 PHP 中文件上传的清单:

  1. 检查 php.ini 以获取:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M
  • 您可能需要使用,或者如果您使用的是共享主机并且无权访问 ..htaccess.user.iniphp.ini
  • 确保您正在编辑正确的ini文件 - 使用该函数验证您的设置是否实际被应用。phpinfo()
  • 还要确保你没有拼错大小 - 它不应该是.100M100MB
  1. 确保您的代码具有该属性。没有其他标签可以工作,它必须是您的FORM标签。仔细检查拼写是否正确。仔细检查多部分/表单数据是否被直引号包围,而不是从Word或网站博客粘贴的智能引号(WordPress将直引号转换为角度引号!如果页面上有多个表单,请确保它们都具有此属性。手动键入它们,或尝试手动键入的直单引号。<form>enctype="multipart/form-data"

  2. 确保没有两个具有相同属性的输入文件字段。如果需要支持多个,请在名称末尾放置方括号:name

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
  3. 确保您的 tmp 和上载目录设置了正确的读写权限。临时上载文件夹在 PHP 设置中指定为 。upload_tmp_dir

  4. 确保文件目标目录和 tmp/上载目录中没有空格。

  5. 确保页面上的所有内容都有关闭标记。<form></form>

  6. 确保您的 FORM 标记具有 .GET 请求不支持分段/表单数据上载。method="POST"

  7. 确保文件输入标记具有 NAME 属性。ID 属性是不够的!ID 属性用于 DOM,而不是 POST 有效负载。

  8. 确保您没有使用Javascript在提交时禁用您的字段<input type="file">

  9. 确保你没有嵌套表单,比如<form><form></form></form>

  10. 检查您的HTML结构中是否有无效/重叠的标签,例如<div><form></div></form>

  11. 还要确保您上传的文件不包含任何非字母数字字符。

  12. 有一次,我花了几个小时试图弄清楚为什么这种情况突然发生在我身上。事实证明,我已经修改了 中的一些PHP设置,其中一个(还不确定是哪个)导致上传失败并变为空。.htaccess$_FILES

  13. 您可以尝试在标记的属性中避免使用下划线 ()_name=""<input>

  14. 尝试上传非常小的文件,以缩小它是否是文件大小问题的范围。

  15. 检查可用磁盘空间。虽然非常罕见,但在此PHP手册页面注释中提到了它:

    如果 $_FILES 数组突然神秘地空了,即使您的表单看起来正确,您也应该检查可用于临时文件夹分区的磁盘空间。在我的安装中,所有文件上传都失败,没有警告。经过多次咬牙切齿后,我尝试释放额外的空间,之后文件上传突然又开始工作了。

  16. 请确保您不是通过 AJAX POST 请求而不是通过导致页面重新加载的正常 POST 请求来提交表单。我浏览了上面列表中的每个点,最终发现我的$_FILES变量为空的原因是我使用AJAX POST请求提交表单。我知道也有使用ajax上传文件的方法,但这可能是您的$ _FILES数组为空的正当理由。

其中一些要点的来源:
https://web.archive.org/web/20050426084124/http://getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/


答案 2

就HTML而言,您似乎已经正确设置了该部分。您已经在表单上拥有非常重要的内容。enctype="multipart/form-data"

就您的设置而言,有时在系统上存在多个文件。确保您正在编辑正确的一个。我知道您说您已将文件配置为具有文件上传功能,但是您是否还设置了和大于您尝试上传的文件?所以你应该有:php.iniphp.iniphp.iniupload_max_filesizepost_max_size

file_uploads = On; sounds like you already did this
post_max_size = 8M; change this higher if needed
upload_max_filesize = 8M; change this higher if needed

您的目录:是否同时具有读取和写入权限?您是否记得在进行更改后重新启动Apache?"c:\wamp\tmp"php.ini



推荐