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

我的Windows 7电脑上安装了WampServer 2。 我正在使用Apache 2.2.11和PHP 5.2.11。 当我尝试上传表单中的任何文件时,它似乎上传,但在PHP中, $_FILES数组是空的。 c:\wamp\tmp文件夹中没有文件。 我已经configurationphp.ini允许file upload等。 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> 

PHP:

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

这里是一个在PHP中上传文件的清单:

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

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

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

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

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

  6. 确保页面上的所有<form>都有</form>closures标签。

  7. 确保你的FORM标签有method="POST" 。 GET请求不支持多部分/表单数据上传。

  8. 确保你的文件input标签有一个NAME属性。 ID属性是不够的! ID属性用于DOM,而不用于POST有效载荷。

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

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

  11. 检查您的HTML结构是否存在无效/重叠的标签,如<div><form></div></form>

  12. 另外请确保您正在上传的文件中没有任何非字母数字字符。

  13. 有一次,我花了好几个小时试图弄清为什么突然间发生这种事情。 事实certificate,我修改了一些在.htaccess中的PHP设置,其中一个(不知道是哪一个)导致上传失败, $_FILES为空。

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

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

  16. 检查您的可用磁盘空间。 虽然非常罕见,但在这个PHP手册页中提到了评论 :

    如果$ _FILES数组突然变得神秘空白,即使表单看起来正确,也应该检查临时文件夹分区的可用磁盘空间。 在我的安装中,所有file upload失败都没有警告。 在咬牙切齿之后,我尝试腾出额外的空间,之后file upload突然重新开始。

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

至于HTML,你似乎已经正确地设置了这个部分。 你已经有了enctype="multipart/form-data"这对表单非常重要。

至于你的php.ini设置,有时在系统上存在多个php.ini文件。 确保你正在编辑正确的。 我知道你说你已经configuration了你的php.ini文件来进行file upload,但是你是否也将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 

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


例如,在表单中添加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> 

谢谢大家的各种综合答复。 这些都是非常有帮助的。 答案结果是非常奇怪的。 事实certificate,PHP 5.2.11不喜欢以下内容:

 post_max_size = 2G 

要么

 post_max_size = 2048M 

如果我将其更改为2047M ,则上载工作。

在这里,我发现另一个原因:当使用JQuery Mobile和表单属性data-ajax设置为true时,FILES数组将为空。 所以将data-ajax设置为false。

如果您尝试上传文件数组,那么您可能需要在php.ini中增加max_file_uploads ,默认设置为20

注意max_file_uploads不能在php.ini之外改变。 参见PHP“Bug”#50684

另一个可能的罪魁祸首是Apacheredirect。 在我的情况下,我已经设置了apache的httpd.conf来将我们网站上的某些页面redirect到http版本,而其他页面则是https版本的页面(如果它们还没有的话)。 我有一个文件inputforms的页面是configuration为强制ssl的页面之一,但指定为表单的行动页面被configuration为http。 所以页面会将上传提交到动作页面的ssl版本,但是apache将其redirect到页面的http版本,并且发布的数据(包括上传的文件)丢失了。

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

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

  upload_tmp_dir="/path/to/some/tmp/folder" 

如果他们想要使用绝对的服务器文件path,您需要检查您的虚拟主机。 你应该能够看到你的php.ini文件中的其他目录示例来确定这一点。 只要我设置它,我的_FILES对象中有值。

最后确保你的tmp文件夹和你正在移动文件的地方有正确的权限,以便读写它们。

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

如果缺less$ _FILES将是空的。

我有一个相同的问题看2小时,很简单,我们先检查我们的服务器configuration。

例:

 echo $upload_max_size = ini_get('upload_max_filesize'); echo $post_max_size=ini_get('post_max_size'); 

任何types的文件大小是:20mb ,但是我们的upload_max_size大于20mb但数组是null 。 答案是我们的post_max_size应该大于upload_max_filesize

 post_max_size = 750M upload_max_filesize = 750M 

我遇到了同样的问题,发现这是我的IDE是问题的一部分。 我直接从IDE(PHPStorm)启动debugging器,而不是直接使用浏览器。 IDE生成的URL如下所示:

 "...localhost:63342/CB_Upload/index.php?_ijt=j2hcbacqepj87bvg66ncuohvne" 

并只使用:

 "...localhost/CB_Upload/index.php" 

工作得很好。 我的设置是PC / Windows 10 / WAMPSERVER 3.0.6 64bit

我在同样的问题上挣扎着,testing了一切,没有收到错误报告,也没有任何错误。 我有error_reporting(E_ALL)但突然间,我意识到,我没有检查的Apache日志和voilà! 脚本语法错误…! (缺less“}”)

所以,即使这是显而易见的检查,它可以被遗忘…在我的情况下(Linux)是在:

 /var/log/apache2/error.log 

我得到了同样的问题,没有一个主题是我的错误。 检查.htaccess文件,如果你有一个,如果“MultiViews”被启用。 我必须禁用它们。

如果您的主脚本是http://Some_long_URL/index.php小心,以便在action字段中指定完整的URL(带有显式的index.php不仅仅是http://Some_long_URL )。 令人惊讶的是,如果没有,正确的脚本执行,但与EN空$ _FILES!

我有类似的问题,并在shamittomar提到的htaccess的问题是错误的价值。

php_value post_max_size 10MB更改为php_value post_max_size 10M

我是空的$_FILES因为在<form enctype="multipart/form-data" method="post">我放置

 </div> <div style="clear:both"></div> 

最初的代码是这样的

 <span class="span_left">Photos (gif/jpg/jpeg/png) </span> <form enctype="multipart/form-data" method="post"> <input name="files[]" type="file" id="upload_file" /> <input type="button" id="upload" value="Upload photo" /> </form> 

我决定修改和

 <div> <span class="span_left">Photos (gif/jpg/jpeg/png) </span> <form enctype="multipart/form-data" method="post"> </div> <div style="clear:both"></div> <input name="files[]" type="file" id="upload_file" /> <input type="button" id="upload" value="Upload photo" /> </form> <div style="clear:both"></div> 

所以得出的结论是,在<form enctype="multipart/form-data" method="post">必须是<input name, type, id并且不能是<div>或者其他一些标签

在我的情况下正确的代码是

 <div> <span class="span_left">Photos (gif/jpg/jpeg/png) </span> </div> <div style="clear:both"></div> <form enctype="multipart/form-data" method="post"> <input name="files[]" type="file" id="upload_file" /> <input type="button" id="upload" value="Upload photo" /> </form> <div style="clear:both"></div> 

我也有$ _FILES空的问题。 上面的检查列表没有提到.htaccess,httpd.conf或httpd-vhost.conf中的MultiView。

如果在包含网站的目录的options指令中设置了MultiView,则$ _FILES将为空,即使Content-Length标头显示我上传的文件。

如果你正在使用JQuery Mobile

使用带有文件input的多部分表单不受Ajax支持。 在这种情况下,您应该使用data-ajax =“false”来修饰父表单,以确保将表单正确提交给服务器。

 <form action="upload.php" method="post" enctype="multipart/form-data" data-ajax="false"> Select image to upload: <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="Upload Image" name="submit"> </form> 

检查你的php.ini的enable_post_data_reading = On ,因为:

禁用此选项将导致不填充$ _POST和$ _FILES 。 读取postdata的唯一方法是通过php://inputstream包装器。 (…)

http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading