2012-04-11 2 views
0

У меня есть сценарий для загрузки нескольких изображений в каталог. Я понимаю, что с помощью массивов. Поэтому я получил этот код:загружать несколько файлов и отображать массив

$allowed_extension = array('jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif'); 
$errors = array(); 
$output = array(); 

if(!empty($_FILES['image']['tmp_name'])){ 

    foreach($_FILES['image']['name'] as $key => $array_value){ 

     if(!in_array(pathinfo($_FILES['image']['name'][$key], PATHINFO_EXTENSION), $allowed_extension)){ 
       die("Die!"); 
     } 
    } 

    foreach($_FILES['image']['name'] as $key => $array_value){ 

     $file_name = $_FILES['image']['name'][$key]; 
     $file_size = $_FILES['image']['size'][$key]; 
     $file_tmp = $_FILES['image']['tmp_name'][$key]; 

     $file_extension = pathinfo($file_name, PATHINFO_EXTENSION); 
     $file_extension = strtolower($file_extension); 

     if (!in_array($file_extension, $allowed_extension)){ 
     $errors[$file_name][] = "format $file_extension in image $file_name is not accepted"; 
     continue; 
     } 

     if ($file_size > 2097152){ 
     $errors[$file_name][] = "maxsize of 2MB on $file_name has reached"; 
        } 

     if (count($errors) == 0){ 

     $dir = "a/b/c"; 

     if (is_dir($dir)){ 
      mkdir("a/b/c/tmp_images", 0755); 
     }else{ 
      mkdir("a/b/c", 0755); 
      mkdir("a/b/c/tmp_images", 0755); 
     } 

     $path = "a/b/c/tmp_images"; 
     $prifix = basename($file_name, "." . $file_extension); 

     //var_dump ($prifix); 

     $uploadfile = $path . "/" . $file_name; 

     $x = 0; 
     while (file_exists($uploadfile)){ 
       $x ++; 
       $uploadfile = "{$path}/{$prifix}-{$x}.{$file_extension}"; 
      } 

      if (move_uploaded_file($file_tmp, $uploadfile)){ 
       $file_name = basename($uploadfile); 
       $output [$file_name] = "OK"; 

      }else{ 

      $output[$file_name] = "Failure while Uploading!"; 
      $errors[$file_name][] = "Failure: Can't move uploaded pictures!"; 
      }//else... 
     }//if(count($errors))... 
    }//foreach($_FILES['image']['name']... 
}//if(!empty($_FILES['image']['tmp_name'])... 

теперь моя первая проблема: «Летучая», когда у меня есть два различных вида типов файлов, то загрузка будет прервана, и сообщение об ошибке будет отображаться. как это видно в коде, первая часть foreach сделает это. вторая часть foreach делает то, что мне действительно нравится показывать, но когда я оставляю первую часть foreach в случае одного неправильного и одного правильного типа файла, загрузка будет иметь место. проблема заключается в том, что пользователь не может внести никаких изменений после отправки данных. для загрузки необходимо прервать.

моя вторая проблема: когда я покидаю первую часть foreach, на ней будет отображаться только «массив» вместо отображения массива [0], который содержит сообщение об ошибке в случае неправильного типа файла или его размера. поэтому выход не должен быть «массивом», он должен быть «maxsize 2MB на $ file_name достиг»

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

+0

Почему вы зацикливаетесь на определенный ключ в суперкоммуляторе $ _FILES? $ _FILES ['image'] ссылается на одно из изображений. Два изображения не могут иметь один и тот же ключ. Это будет только цикл один раз ... Можете ли вы предоставить HTML? – trickyzter

+0

Bonny - одно предложение. Когда вы имеете дело с массивами, вы можете использовать функцию print_r, чтобы увидеть структуру массива. Поэтому, если есть часть вашего кода, где вы не можете понять, как обращаться с массивом, используйте print_r для вывода того, что происходит под капотом. В большинстве случаев это покажет вам, где вы делаете предположения о структуре массива, которая может быть необоснованной. –

+0

Используйте 'if ($ _FILES ['image'] ['error'] === UPLOAD_ERR_OK)', чтобы проверить успешность загрузки. Вы все равно можете получить tmp_name, даже если файл усечен/поврежден. и не доверяйте предоставленному пользователем имени файла. Невозможно выполнить 'ren nastyvirus.exe cutekittens.jpg' и проскользнуть прямо через вашу систему безопасности. –

ответ

1

Не используйте штамп («Die!»); в вашем коде, поскольку он завершает выполнение скрипта. Предоставьте HTML-код, чтобы найти причину маршрута.

+0

Что это значит -> Предоставьте свой HTML-код, чтобы найти причину маршрута? Благодарю. – bonny

+0

Код, в котором вы сохранили выбор файлов и кнопку обзора для нескольких файлов ... –

Смежные вопросы