Загрузка нескольких файлов php

У меня есть сценарий, который я разрабатываю для загрузки до 10 файлов одновременно. У меня есть 10 отдельных входов в моем html:

  <?php
    for($i=0;$i<10;++$i) {
         $num = $i+1;
         echo '
            <span>'.$num.'</span><input type="file" name="photo'.$i.'" />
              ';
     }
  ?>

И затем у меня есть загрузчик, который я использовал раньше - в немного другой форме - но теперь он не может работать:

$path = "../path/to/folder/";
for($i = 0; $i < 20; $i++){
  $fileName = "photo". "$i";
  $filePath = "$path". "photo$i.jpg";

  if (!empty($_FILES['$fileName']['tmp_name'][$i])) {
       if (!copy($_FILES['$fileName']['tmp_name'][$i], $filePath)) {
            echo "failed to save '.$filePath.'";
        }
       chmod($filePath, 0644);
     }
 }

В рабочей версии этого скрипта я вырезал цикл for и просто нумеровал каждую закачку отдельно (у меня этот кусок кода без цикла был 10 раз каждый со своим номером). Это отлично сработало, но смотреть на такой фрагмент кода действительно довольно уродливо. Любые идеи, как заставить это работать?

ОБНОВЛЕНО:

Все еще не повезло, я ценю всю помощь. Я думаю, что моя проблема заключается в том, что массивы $_FILES не заполняются должным образом:

изменил HTML на:

  <?php
    for($i=0;$i<10;++$i) {
         $num = $i+1;
         echo '
            <span>'.$num.'</span><input type="file" name="photo[]" />
              ';
     }
  ?>

и скрипт загрузки для:

$path = "../path/to/folder/";
for($i = 0; $i < 20; $i++){
  $fileName = "photo". "$i";
  $filePath = "$path$fileName.jpg";

  if (!empty($_FILES["photo"]["tmp_name"][$i])) {
       if (!copy($_FILES["photo"]["tmp_name"][$i], $filePath)) {
            echo "failed to save '.$filePath.'";
        }
       chmod($filePath, 0644);
     }
 }

person Thomas    schedule 06.10.2010    source источник
comment
Объедините ответы от jsuggs и Pekka, я вижу, что Pekka исправил вашу ошибку цитирования, не упомянув об этом.   -  person Kristoffer Sall-Storgaard    schedule 06.10.2010
comment
Кроме того, проверьте, действительно ли установлено $_FILES[$fileName]. В противном случае вы получите ошибку: if ( isset( $_FILES[$fileName] ) )...   -  person poke    schedule 06.10.2010


Ответы (3)


Вы используете $i дважды:

$_FILES["$fileName"]["tmp_name"][$i]

часть [$i] не имеет для меня смысла: вы уже получаете доступ к каждому элементу через $fileName. Я думаю, вам нужно просто избавиться от [$i].

person Pekka    schedule 06.10.2010
comment
Вы, вероятно, должны были упомянуть, что исправили его ошибку цитирования относительно. '$fileName' -> "$fileName" который... в конце концов мог быть $fileName - person Kristoffer Sall-Storgaard; 06.10.2010
comment
@Kristoffer, если честно, я даже не заметил этого - я заменил его по привычке :) Хорошо заметил, ура. - person Pekka; 06.10.2010
comment
@Pekka исправляет ошибки, не замечая их? Это значительно облегчило бы мой рабочий день. - person Kristoffer Sall-Storgaard; 06.10.2010
comment
спасибо за быстрые ответы! но я удалил i и исправил кавычки, но фотографии все еще не загружаются :-( - person Thomas; 06.10.2010
comment
@pekka показывает мне пустой массив -- буквально Array() :-/ - person Thomas; 06.10.2010
comment
@thomas, можешь показать свою HTML-форму? Сгенерированный в исходном представлении вашего браузера? - person Pekka; 06.10.2010
comment
@pekka нет, я не могу, потому что это смущает. Я открыл исходный код и понял, что забыл включить enctype=multipart/form-data в тег ‹form›. Большое спасибо за всю помощь, по крайней мере, я смог оптимизировать скрипт :-D - person Thomas; 06.10.2010
comment
@thomas enctype был именно тем, что я имел в виду :) Хорошо, что это сработало. - person Pekka; 07.10.2010
comment
@pekka очень рад, что смог это понять, это сводит меня с ума с понедельника -- спасибо за все советы - person Thomas; 07.10.2010

Я считаю (частью) вашей проблемы цитирование. Вы используете одинарные кавычки в своем цикле, из-за чего переменные не оцениваются. Вместо этого попробуйте использовать приведенный ниже код. Могут быть некоторые другие проблемы, но это должно решить один аспект вашей проблемы.

$path = "../path/to/folder/";
for($i = 0; $i < 20; $i++){
  $fileName = "photo". $i;
  $filePath = "$path". "$fileName.jpg";

  if (!empty($_FILES["$fileName"]['tmp_name'][$i])) {
       if (!copy($_FILES["$fileName"]['tmp_name'][$i], $filePath)) {
            echo "failed to save $filePath";
        }
       chmod($filePath, 0644);
     }
 }
person jsuggs    schedule 06.10.2010

вы слишком усложнили это
хотя нет ничего проще
просто foreach над $_FILES

foreach ($_FILES as $file) {
  $filePath = $path. "photo".($i++).".jpg";
  if (!$file['error']) {
    move_uploaded_file($file['tmp_name'], $filePath));
  }
}

это все для первого соглашения об именах.

person Your Common Sense    schedule 06.10.2010
comment
не уверен, где именно это реализовать, я вырезал весь материал $_FILES и поместил этот код в for($i = 0; $i ‹ 20; $i++), но все еще не могу ничего загрузить на самом деле :-/ спасибо - person Thomas; 06.10.2010
comment
@thomas это ВЕСЬ код, который вам нужен. Хотя, если ваш массив $_FILES пуст, он, очевидно, не будет работать. - person Your Common Sense; 06.10.2010