В массиве PHP $ _FILE отсутствуют записи из отправленной HTML-формы - PullRequest
5 голосов
/ 28 января 2010

Обычно, когда в одной форме загружается более 25 файлов, массив PHP $ _FILES обрезается до первых 25 записей (0-24), что неверно. Должно быть все 31. Это происходит только на одном конкретном сервере. Апач с PHP. Я пробовал это на двух других серверах, и они, кажется, позволяют все 31.

Может ли это быть вызвано каким-то параметром конфигурации в Apache? Или это более вероятно проблема конфигурации в PHP?

Единственное, о чем я могу думать, это, возможно, директива Apache LimitRequestFields, но это должно вызвать ошибку, а не просто обрезать ее до первых 25. Верно?

Я знаю, что иметь столько полей File в одной форме - это плохая практика, однако это необходимо из-за функциональности, необходимой для этой конкретной страницы. Я не могу обойти это.

Любая помощь с этой проблемой будет принята с благодарностью.

Приведенный ниже 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 ]

3 голосов
/ 28 января 2010

То, что " 25 max files " и " происходит только на конкретном сервере ", по-видимому, указывает на некоторые меры конфигурации / безопасности на этом сервере.

И " 25 max uploads " - это конфигурация по умолчанию для расширения suhosin PHP - см. Директиву конфигурации suhosin.upload.max_uploads.


Это расширение установлено по умолчанию (по соображениям безопасности) в некоторых дистрибутивах Linux - Ubuntu предоставляет его по умолчанию, например, если я правильно помню; Вы можете проверить, установлен ли он / включен на выходе phpinfo().

1 голос
/ 28 января 2010

Ознакомьтесь с разделом «Загрузка файлов» директив ini-файлов .

Начиная с PHP 5.2.12, доступна настройка ограничения max_file_uploads, которую вы, возможно, захотите отрегулировать, если используете эту версию или выше.

Кроме того, upload_max_filesize - это максимум всего для всех загруженных файлов, вместе взятых, поэтому вполне возможно, что вы можете достичь там предела, хотя из описания это звучит скорее как * Ограничитель это проблема.

0 голосов
/ 28 января 2010

почему бы не использовать 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);

           ?????????????????????????????????????????????????????
           ?????????????????????????????????????????????????????
0 голосов
/ 28 января 2010

Ознакомьтесь с директивами LimitRequest *:

http://httpd.apache.org/docs/2.2/en/mod/core.html#limitrequestbody

0 голосов
/ 28 января 2010

Если смотреть на настройки конфигурации Suhosin не работает. Попробуйте проверить параметры upload_max_filesize и post_max_size в php.ini.

0 голосов
/ 28 января 2010

PHP помещает загруженные файлы во временную директорию. Таким образом, вы можете проверить, связана ли проблема с PHP или Apache, проверив, находятся ли дополнительные 6 файлов в этом временном каталоге.

Что я хотел бы сделать, это получить местоположение первого файла, а затем запустить цикл, чтобы отобразить все файлы в этом каталоге. Если это 31, это PHP, если 25, это Apache.

...