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中文件上传的检查列表:
检查php.ini:
file_uploads = On
post_max_size = 100M
upload_max_filesize = 100M
.htaccess
或者.user.ini
如果您在共享主机上并且无权访问php.ini
.phpinfo()
功能验证您的设置是否实际应用.100M
不是 100MB
.确保您的<form>
代码具有该enctype="multipart/form-data"
属性.没有其他标签可以使用,它必须是您的FORM标签.仔细检查拼写是否正确.仔细检查多部分/表单数据是否被STRAIGHT QUOTES包围,而不是从Word或网站博客中粘贴的智能引号(WordPress将直引号转换为角度报价!).如果页面上有多个表单,请确保它们都具有此属性.手动输入,或尝试手动输入直接单引号.
确保没有两个具有相同name
属性的输入文件字段.如果您需要支持多个,请在名称末尾加上方括号:
<input type="file" name="files[]">
<input type="file" name="files[]">
Run Code Online (Sandbox Code Playgroud)确保您的tmp和upload目录具有正确的读取和写入权限集.临时上载文件夹在PHP设置中指定为upload_tmp_dir
.
确保文件目标和tmp/upload目录中没有空格.
确保<form>
页面上的所有内容都有</form>
关闭标记.
确保您的FORM标签有method="POST"
.GET请求不支持multipart/form-data上传.
确保文件输入标记具有NAME属性.ID属性是不够的!ID属性用于DOM,而不用于POST有效负载.
确保您没有使用Javascript <input type="file">
在提交时禁用您的字段
确保你没有像这样嵌套表格 <form><form></form></form>
检查HTML结构中是否存在无效/重叠标记 <div><form></div></form>
还要确保您上传的文件中没有任何非字母数字字符.
有一次,我花了好几个小时试图弄清楚为什么会突然发生这种情况.事实证明我已经修改了一些PHP设置.htaccess
,其中一个(不确定哪个)导致上传失败并且$_FILES
为空.
您可以尝试在标记_
的name=""
属性中避免使用下划线()<input>
尝试上传非常小的文件以缩小是否是文件大小问题.
检查可用磁盘空间.虽然非常罕见,但在本PHP手册页面评论中提到:
如果$ _FILES数组突然出现空洞,即使表单看起来正确,也应该检查可用于临时文件夹分区的磁盘空间.在我的安装中,所有文件上传都失败而没有警告.在咬牙切齿之后,我尝试释放额外的空间,之后文件上传突然再次起作用.
确保您没有通过AJAX POST请求而不是正常的POST请求提交表单,导致页面重新加载.我浏览了上面列表中的每一点,最后发现我的$ _FILES变量为空的原因是我使用AJAX POST请求提交表单.我知道有一些方法可以使用ajax上传文件,但这可能是你的$ _FILES数组为空的正当理由.
其中一些要点的来源:http:
//getluky.net/2004/10/04/apachephp-_files-array-mysteriously-empty/
Bri*_*ian 72
至于您似乎已正确设置该部分的HTML.你已经拥有enctype="multipart/form-data"
了表格中非常重要的内容.
就您的php.ini
设置而言,有时在系统上php.ini
存在多个文件.确保您正在编辑正确的.我知道你说你已经配置你的php.ini
文件有文件上传,但你也设置你的upload_max_filesize
和post_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 ?
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
,则上传有效.
我有一个相同的问题看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)
没有人提到这一点,但它帮助了我,网络上没有多少地方提到它。
确保您的 php.ini 设置了以下键:
upload_tmp_dir="/path/to/some/tmp/folder"
Run Code Online (Sandbox Code Playgroud)
如果他们希望您使用绝对服务器文件路径,您需要与您的虚拟主机商确认。您应该能够在 php.ini 文件中看到其他目录示例来确定这一点。一旦我设置了它,我就在我的 _FILES 对象中得到了值。
最后确保您的 tmp 文件夹以及您移动文件的任何位置具有正确的权限,以便可以读取和写入它们。
我正在努力解决同样的问题并测试所有内容,没有收到错误报告,似乎没有任何问题。我有 error_reporting(E_ALL) 但突然我意识到我没有检查 apache 日志,瞧!脚本中存在语法错误...!(缺少“}”)
所以,即使这是明显需要检查的东西,它也可以被遗忘......在我的情况下(linux)它位于:
/var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)