Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Загрузка нескольких файлов
 
 автор: dimon   (18.09.2007 в 12:39)   письмо автору
 
 

Здрасте всем! У меня вопрос по уже избитой теме загрузки файлов. У меня есть скрипт, большой, в котором есть и текстовые и все остальные поля, включая и type="file". и вот тут есть такая странность, что если используется только одно поле файл с одним именем 'filename', то все работает прекрасно, но как только я пытаюсь закачать несколько файлов, изменив имя поля file на 'filename[]', все летит, т.е. никакого эффекта. Причем использовал и вроде работающие скрипты с форума, из одной из похожих тем. Не подскажете в чем может быть дело, может где-то есть запрет на закачку нескольких файлов?
Спасибо!

   
 
 автор: buro   (18.09.2007 в 12:45)   письмо автору
 
   для: dimon   (18.09.2007 в 12:39)
 

покажи хоть пример чтоль :) и что меняешь. кусок кода

   
 
 автор: dimon   (18.09.2007 в 13:50)   письмо автору
 
   для: dimon   (18.09.2007 в 12:39)
 

у меня просто весь скрипт и форма довольно объёмные, поэтому только отрывки кода, которые я, в общем, описал словами:
<input name="item_pict_small[]" type="file" accept="image/jpeg" />

есть несколько таких полей, т.е. которые подразумевают создание скалярного массива. обрабатывается он так:
<?
if (isset($file)) {
for (
$i=0;$i<count($item_pict_small); $i++){
  if (
move_uploaded_file($_FILES['item_pict_small'][$i]['tmp_name'],$image_dir_small_l.$_FILES['item_pict_small'][$i]['name'])) 
  echo 
'OK!';
else exit;
echo 
"<img alt=\"описание\" src=\"".$image_dir_small.$_FILES["item_pict_small"][$i]["name"]."\" border=\"0\" />";
            if (
$i<count($item_pict_small)-1) echo "\n".$hr."\n";} } }?>

Еще пробовал вариант с foreach, но тоже ничего не выходит...
Если делать тоже самое, но
<input name="item_pict_small" type="file" accept="image/jpeg" />
(без "[]" в name) которое обрабатывается:
<?
if (isset($file)) {
  if (
move_uploaded_file($_FILES['item_pict_small']['tmp_name'],$image_dir_small_l.$_FILES['item_pict_small']['name'])) 
  echo 
'OK!';
else exit;
}
?>
, то все прекрасно работает.

Только что еще раз, на всякий случай проверил. Я не РНР гуру, но вроде как тут все верно, но допускаю, что мог чего и пропустить. Надеюсь кто-нибудь заметит, если что. Спасибо!

   
 
 автор: dimon   (19.09.2007 в 11:48)   письмо автору
 
   для: dimon   (18.09.2007 в 12:39)
 

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

   
 
 автор: cheops   (19.09.2007 в 11:58)   письмо автору
 
   для: dimon   (19.09.2007 в 11:48)
 

Дело ещё в браузерах - помоему не все поддерживают загрузку нескольких файлов с одним и тем же именем на сервер.

   
 
 автор: dimon   (19.09.2007 в 12:13)   письмо автору
 
   для: cheops   (19.09.2007 в 11:58)
 

а разве это не работа РНР? он же обработчик на удалённом сервере, как браузер может влиять не его работу? или РНР "берет" нужные файлы через браузер?

   
 
 автор: sim5   (19.09.2007 в 13:09)   письмо автору
 
   для: dimon   (19.09.2007 в 12:13)
 

А чему у вас приравнена $item_pict_small?

   
 
 автор: dimon   (19.09.2007 в 14:22)   письмо автору
 
   для: sim5   (19.09.2007 в 13:09)
 

в смысле? я чего-то не понимаю? это ж переменная поля файл, т.е. я выбираю файл на своем локальном диске, и, если я использую одно поле, то все прокатывает, а если несколько полей с одним именем + "[ ]" (скалярный массив), то аблом.
Я не знаю, ответил я или нет на твой вопрос, но я все-таки не уверен, что его понял, сорри: новичок ))

   
 
 автор: evgenijj   (19.09.2007 в 16:54)   письмо автору
 
   для: dimon   (19.09.2007 в 14:22)
 


<?php
if ( !isset( $_POST["upload"] ) )
{
  echo 
'<form action="upload.php" method="post" enctype="multipart/form-data">';
  echo 
'Send these files:<br/>';
  echo 
'<input type="file" name="userfile[]" /><br/>';
  echo 
'<input type="file" name="userfile[]" /><br/>';
  echo 
'<input type="submit" name="upload" value="Отправить файлы" />';
  echo 
'</form>';
}
else
{
  for ( 
$i=0$i<count($_FILES['userfile']['name']); $i++ )
  {
    if ( empty(
$_FILES['userfile']['name'][$i]) ) continue;
    if( 
move_uploaded_file($_FILES['userfile']['tmp_name'][$i], $_FILES['userfile']['name'][$i]) )
      echo 
"Файл ".$_FILES['userfile']['name'][$i]." успешно загружен<br/>";
    else
      echo 
"Ошибка при загрузке файла ".$_FILES['userfile']['name'][$i]."<br/>";
  }
}
?>


Обрати внимание, как у меня
$_FILES['userfile']['tmp_name'][$i]
и у тебя
$_FILES['item_pict_small'][$i]['tmp_name']

   
 
 автор: dimon   (19.09.2007 в 21:13)   письмо автору
 
   для: evgenijj   (19.09.2007 в 16:54)
 

Я [$i] ставил между именем переменной и атрибутом (надеюсь правильная терминология), потому что где-то тут же на форуме видел такие примеры... а может не на те смотрел)))

в любом случае спасибо... в этом и была загвоздка: в циклах for и foreach ключ нужно ставить в самом конце, а не где-то в центре, как у меня в первом коде, или как тут: http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=42400 (кстати, так никто и не поправил там ошибки)... ладно, всем спасибо за участие. удачи!

   
 
 автор: sim5   (19.09.2007 в 17:09)   письмо автору
 
   для: dimon   (19.09.2007 в 14:22)
 

Ну во-первых установите register_globals в off и обращайтесь к суперглобальному массиву $_FILES. Во-вторых, если вы выведите в браузер count($_FILES['pict']), то сможете заметить, что число не будет равно числу загружаемых файлов. Вот пример для проверки загрузки на сервер (возьмете то, что вам нужно будет):


<form action="" method="post" enctype="multipart/form-data">
<input name="pict[]" type="file">
<input name="pict[]" type="file">
<input name="pict[]" type="file">
<input type="submit" name="sendfile" value="GO">
</form>

<?
if (isset($_POST['sendfile'])) {
 
$num count($_FILES['pict']['name']);
 
$s '';
 for (
$i 0$i $num$i++) {
   
$f move_uploaded_file($_FILES['pict']['tmp_name'][$i],$_FILES['pict']['name'][$i]);
   if (
$f)
   
$s .= $_FILES['pict']['name'][$i].' - размер: '.$_FILES['pict']['size'][$i].' байт<br>';
  }
 echo 
$s;
}
?>

   
 
 автор: cheops   (20.09.2007 в 11:13)   письмо автору
 
   для: dimon   (19.09.2007 в 12:13)
 

>а разве это не работа РНР? он же обработчик на удалённом сервере, как браузер может влиять
>не его работу? или РНР "берет" нужные файлы через браузер?
PHP работает на сервере, обмен файлов осуществляет браузер и Apache.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования