PHP $ _FILE数组缺少提交的HTML表单中的条目

时间:2010-01-28 05:53:45

标签: php apache forms file-upload

基本上,当我在一个表单中上传超过25个文件时,PHP $ _FILES数组被裁剪为前25个条目(0-24),这是不正确的。它应该全部31。 这只发生在一个特定的服务器上。 Apache与PHP。我已经在另外两台服务器上试过了,它们似乎允许全部31个。

这可能是由Apache中的某些配置选项引起的吗?或者它更可能是PHP中的配置问题?

我唯一能想到的可能就是LimitRequestFields apache指令,但是这应该抛出一个错误,而不是将它裁剪到前25个。对吗?

我知道在一个表单中包含如此多的文件字段是不好的做法,但由于此特定页面所需的功能,这是必需的。我无法解决这个问题。

非常感谢任何有关此问题的帮助。

下面的HTML演示了我遇到的问题。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<form enctype="multipart/form-data" action="test.php" method="post">
<input type="file" name="field_id_11[0][1]"/>
<input type="file" name="field_id_11[1][1]"/>
<input type="file" name="field_id_11[2][1]"/>
<input type="file" name="field_id_11[3][1]"/>
<input type="file" name="field_id_11[4][1]"/>
<input type="file" name="field_id_11[5][1]"/>

<input type="file" name="field_id_11[6][1]"/>
<input type="file" name="field_id_11[7][1]"/>
<input type="file" name="field_id_11[8][1]"/>
<input type="file" name="field_id_11[9][1]"/>
<input type="file" name="field_id_11[10][1]"/>
<input type="file" name="field_id_11[11][1]"/>
<input type="file" name="field_id_11[12][1]"/>
<input type="file" name="field_id_11[13][1]"/>
<input type="file" name="field_id_11[14][1]"/>
<input type="file" name="field_id_11[15][1]"/>
<input type="file" name="field_id_11[16][1]"/>
<input type="file" name="field_id_11[17][1]"/>
<input type="file" name="field_id_11[18][1]"/>
<input type="file" name="field_id_11[19][1]"/>
<input type="file" name="field_id_11[20][1]"/>
<input type="file" name="field_id_11[21][1]"/>
<input type="file" name="field_id_11[22][1]"/>

<input type="file" name="field_id_11[23][1]"/>
<input type="file" name="field_id_11[24][1]"/>
<input type="file" name="field_id_11[25][1]"/>
<input type="file" name="field_id_11[26][1]"/>
<input type="file" name="field_id_11[27][1]"/>
<input type="file" name="field_id_11[28][1]"/>
<input type="file" name="field_id_11[29][1]"/>
<input type="file" name="field_id_11[30][1]"/>
<input type="text" name="blah" value="something"/>
<input type="submit" />
</form>

</body>
</html>

6 个答案:

答案 0 :(得分:3)

25个最大文件”和“仅在特定服务器上发生”似乎表明该服务器上有一些配置/安全措施。

25 max uploads ”是suhosin PHP extension的默认配置 - 请参阅suhosin.upload.max_uploads配置指令。


在某些Linux发行版上默认安装(出于安全原因)的扩展名 - 默认情况下Ubuntu提供它,例如,如果我没记错的话;您可以在phpinfo()的输出中检查它是否已安装/启用。

答案 1 :(得分:1)

查看ini file directives

的文件上传部分

自PHP 5.2.12起可以使用max_file_uploads限制设置,如果您使用的是该版本或更高版本,可能需要调整此设置。

同样,upload_max_filesize是所有上传文件组合的最大值,因此您可能会在那里达到限制,尽管从描述中听起来更可能是问题是max_file_uploads限制器。

答案 2 :(得分:0)

PHP将上传的文件放入临时目录。因此,您可以通过检查额外的6个文件是否在该临时目录中来确认问题是PHP还是Apache。

我要做的是获取第一个文件的位置,然后运行循环以回显该目录中的所有文件。如果它是31,它是PHP,如果是25,那就是Apache。

答案 3 :(得分:0)

如果查看Suhosin配置设置不起作用。请尝试检查php.ini中的upload_max_filesizepost_max_size选项。

答案 4 :(得分:0)

答案 5 :(得分:0)

为什么不使用move_uploaded_file它的工作只是尝试在数组中添加路径并在此函数中执行如果不起作用?复制move_uploaded_file(文件数)这不好,但它的工作 试试

$file1 = $_POST['file1'];
$file2 = $_POST['file2'];
$file3 = $_POST['file3'];
$file4 = $_POST['file4'];
$file5 = $_POST['file5'];
$file6 = $_POST['file6'];
$array = array($file1,$file2,$file3,$file4,$file5,$file6);

 if(isset($_POST['submit']))
 {
  for($i=0;$i<count($array);$i++)
  {
   $dir = $array[$i];

   $uploaddir  = "dirfiles/";
   $uploadfile = $uploaddir.$_FILES['file1']['name'];
   move_uploaded_file($_FILES['file21']['tmp_name'],$uploadfile);

   $uploaddir  = "dirfiles/";
   $uploadfile = $uploaddir.$_FILES['file2']['name'];
   move_uploaded_file($_FILES['file2']['tmp_name'],$uploadfile);

           ?????????????????????????????????????????????????????
           ?????????????????????????????????????????????????????