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

elm*_*nty 133 php apache file-upload

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

HTML:

<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>
Run Code Online (Sandbox Code Playgroud)

PHP:

<?php
echo 'file count=', count($_FILES),"\n";
var_dump($_FILES);
echo "\n";
?>
Run Code Online (Sandbox Code Playgroud)

sha*_*mar 451

这是PHP中文件上传的检查列表:

  1. 检查php.ini:
    file_uploads = On
    post_max_size = 100M
    upload_max_filesize = 100M

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

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

    <input type="file" name="files[]">
    <input type="file" name="files[]">
    
    Run Code Online (Sandbox Code Playgroud)
  4. 确保您的tmp和upload目录具有正确的读取和写入权限集.临时上载文件夹在PHP设置中指定为upload_tmp_dir.

  5. 确保文件目标和tmp/upload目录中没有空格.

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

  7. 确保您的FORM标签有method="POST".GET请求不支持multipart/form-data上传.

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

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

  10. 确保你没有像这样嵌套表格 <form><form></form></form>

  11. 检查HTML结构中是否存在无效/重叠标记 <div><form></div></form>

  12. 还要确保您上传的文件中没有任何非字母数字字符.

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

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

  15. 尝试上传非常小的文件以缩小是否是文件大小问题.

  16. 检查可用磁盘空间.虽然非常罕见,但在本PHP手册页面评论中提到:

    如果$ _FILES数组突然出现空洞,即使表单看起来正确,也应该检查可用于临时文件夹分区的磁盘空间.在我的安装中,所有文件上传都失败而没有警告.在咬牙切齿之后,我尝试释放额外的空间,之后文件上传突然再次起作用.

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

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

  • 也许"接受"的答案解决了原帖,但这个答案是我发现最有帮助的答案.如有疑问,请查看浏览器看到的源代码.检查此列表中的每个项目并向后跟踪,我在一个意想不到的地方发现了我的错误.如果你正在努力解决类似的问题,请相信我,这可能不是Apache中的一个错误.;) (10认同)
  • 还要确保包含文件输入的表单元素不是另一个表单元素的子元素.例如`<form> <form> <input type ="file"> </ form> </ form>` (3认同)
  • 哇!谢谢你的清单.我的问题是#2.我在提交处理程序中调用`$('#my-form')[0] .reset();`. (3认同)
  • 谢谢。在我的情况下是7。罪魁祸首是enctype =“ multipart / form-data”。 (2认同)
  • 杜德,你是救命稻草。我花了数小时试图弄清楚这个问题(2)是我的问题...谢谢! (2认同)

Bri*_*ian 72

至于您似乎已正确设置该部分的HTML.你已经拥有enctype="multipart/form-data"了表格中非常重要的内容.

就您的php.ini设置而言,有时在系统上php.ini存在多个文件.确保您正在编辑正确的.我知道你说你已经配置你的php.ini文件有文件上传,但你也设置你的upload_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
Run Code Online (Sandbox Code Playgroud)

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


  • +1:用于重新启动Apache服务器提示.许多Windows用户忘记了这一点. (4认同)

med*_*eda 32

enctype="multipart/form-data"例如,添加到表单中非常重要

<form action="upload.php" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="Upload Image" name="submit">
</form>
Run Code Online (Sandbox Code Playgroud)


elm*_*nty 14

谢谢大家的全面回复.这些都非常有帮助.答案结果证明是非常奇怪的.事实证明PHP 5.2.11不喜欢以下内容:

post_max_size = 2G
Run Code Online (Sandbox Code Playgroud)

要么

post_max_size = 2048M
Run Code Online (Sandbox Code Playgroud)

如果我将其更改为2047M,则上传有效.

  • 请注意,如此高的值是对空间/ ddos​​攻击的漏洞.只是添加这个,以便人们在尝试复制和粘贴您的解决方案时意识到它太多了.无论如何,2演出需要一个太长的上传时间. (17认同)
  • 不再太大了。我们有经常上传 1-3G 范围内文件的客户。由于他们将文件上传到自己的服务器上,并且它们是IP白名单服务器,因此交换是很正常的,只是允许客户端按照他们想要的方式使用其设备的一种方式。他们支付账单,不涉及安全风险,没有问题。 (2认同)

che*_*711 6

这里找到了另一个原因:当使用JQuery Mobile并且表单属性data-ajax设置为true时,FILES数组将为空.所以将data-ajax设置为false.


小智 6

确保您的输入元素具有“名称”属性。 <input type="file" name="uploadedfile" />

如果缺少此项,则 $_FILES 将为空。


sha*_*493 5

我有一个相同的问题看2小时,我们很容易检查我们的服务器配置.

例:

echo $upload_max_size = ini_get('upload_max_filesize');  
echo $post_max_size=ini_get('post_max_size');   
Run Code Online (Sandbox Code Playgroud)

任何类型的文件大小:20mb,但我们upload_max_size在上面,20mb但数组是null.答案是我们post_max_size应该大于 upload_max_filesize

post_max_size = 750M  
upload_max_filesize = 750M
Run Code Online (Sandbox Code Playgroud)


Aar*_*onP 5

没有人提到这一点,但它帮助了我,网络上没有多少地方提到它。

确保您的 php.ini 设置了以下键:

    upload_tmp_dir="/path/to/some/tmp/folder"
Run Code Online (Sandbox Code Playgroud)

如果他们希望您使用绝对服务器文件路径,您需要与您的虚拟主机商确认。您应该能够在 php.ini 文件中看到其他目录示例来确定这一点。一旦我设置了它,我就在我的 _FILES 对象中得到了值。

最后确保您的 tmp 文件夹以及您移动文件的任何位置具有正确的权限,以便可以读取和写入它们。


Lui*_*ety 5

我正在努力解决同样的问题并测试所有内容,没有收到错误报告,似乎没有任何问题。我有 error_reporting(E_ALL) 但突然我意识到我没有检查 apache 日志,瞧!脚本中存在语法错误...!(缺少“}”)

所以,即使这是明显需要检查的东西,它也可以被遗忘......在我的情况下(linux)它位于:

/var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)