Помогите найти ошибку в скрипте загрузки файлов

D
На сайте с 20.09.2010
Offline
175
151

Есть простой скрипт загрузки нескольких файлов с такой логикой:

if(count($_FILES['photos']['name'])>0)
 {
   if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")
                {
                        echo count($_FILES['photos']['name']);
                        print_r($_FILES);
                        for($i=0; $i<=count($_FILES['photos']['name'])-1; $i++)
                                {
                                        ///// Здесь сама загрузка
                                }       
                }
}                       

Выбираю 5 файлов и получаю такой вот результат работы скрипта:

[photos] => Array ( [name] => Array ( [0] => 1.jpg [1] => 2.jpg [2] => 3.jpg [3] => 4.jpg [4] => 5.jpg ) [type] => Array ( [0] => image/jpeg [1] => [2] => image/jpeg [3] => [4] => image/jpeg ) [tmp_name] => Array ( [0] => /home/site/tmp/phpli4RKO [1] => [2] => /home/site/tmp/phpN5JgML [3] => [4] => /home/site/tmp/phpDzvWGK )

Причем массив [type] и [tmp_name] всегда заполняются по разному случайным образом, тоесть сейчас через один пустые, при второй загрузке могут быть первые 2 со значениями быть а остальные пустые и т.д.

Массив ошибок такой(взял с другого примера, но ВСЕГДА тоже 6 ошибка, тоже случайным образом):

[error] => Array ( [0] => 6 [1] => 6 [2] => 0 [3] => 6 [4] => 6 [5] => 6 [6] => 0 [7] => 0 [8] => 0 [9] => 6 [10] => 6 [11] => 6 [12] => 0 [13] => 0 [14] => 0 )

Получается что у меня при выборе N файлов всегда загружается N-random

Подскажите, почему массивы [type] и [tmp_name] заполняются всегда случайным образом? Где ошибка? Может что-то в настройках сервера?

P.S

В php.ini стоят следующие настройки:

upload_max_filesize    20M

post_max_size    100M

max_file_uploads    20

Общий объем загружаемых файлов не превышает 15 Мб





tommy-gung
На сайте с 22.11.2006
Offline
304
#1

> Причем массив [type] и [tmp_name] всегда заполняются по разному случайным образом

почему случайным? где не загрузился файл пусто, логично же

коды ошибок - https://www.php.net/manual/ru/features.file-upload.errors.php

Здесь не могла быть ваша реклама
S
На сайте с 13.10.2014
Offline
171
#2
массивы заполняются в том порядке в каком файлы передает клиент. Поэтому и разнобой. 
dma84
На сайте с 21.04.2009
Offline
168
#3
if(count($_FILES['photos']['name'])>0)

Проще заменить на:

if(!empty($_FILES['photos']))

При этом, метод полюбому будет POST, ибо файлы методом GET не передаются.

А за такое бить палками надо

for($i=0; $i<=count($_FILES['photos']['name'])-1; $i++)

Мало того, что вы не знаете, что любые функции в for выполняются каждый цикл, так ещё и полную дичь творите здесь:

$i<=count($_FILES['photos']['name'])-1

Здесь "<=" можно смело заменять на "<" и не уменьшать количество элементов на 1

foreach намного быстрее будет.

И напоследок:

function fixFilesArray(array $_files): array
{
	$walker = static function(array $arr, $fileInfoKey, callable $walker)
	{
		$ret = array();
		foreach($arr as $k => $v)
		{
			if(is_array($v))
			{
				$ret[$k] = $walker($v, $fileInfoKey, $walker);
			}
			else
			{
				$ret[$k][$fileInfoKey] = $v;
			}
		}
		return $ret;
	};

	$files = [];
	foreach($_files as $name => $values)
	{
		if(!array_key_exists($name, $files))
		{
			$files[$name] = [];
		}
		if(!is_array($values['error']))
		{
			$files[$name] = $values;
		}
		else
		{
			foreach((array)$values as $fileInfoKey => $subArray)
			{
				$files[$name] = array_replace_recursive($files[$name], $walker($subArray, $fileInfoKey, $walker));
			}
		}
	}
	return $files;
}
D
На сайте с 20.09.2010
Offline
175
#4
Вобщем проблема оказалась неожиданной - в настройках сервера для папки /home/site/tmp/ увеличил размер и проблема исчезла, там просто не хватало места

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий