Примера Upload - как лучше?

Фанат

oncle terrible
Команда форума
я все по поводу аплоада.
в разделе про загрузку множества файлов убери ты эти скобочки, а?
Массив там еще один городить совершенно излишне. Только путать.
Назови эти три поля поразнообразнее, без скобочек и единичек, плиз, а ниже напиши пример, такой, например:
PHP:
foreach ($_FILES as $key => $value) {
  echo "Имя поля: ".$key;
  echo "Имя файла на компе: ".$value['name'];
  echo "Временное имя файла на сервере: ".$value['tmp_name'];
}
 

Фанат

oncle terrible
Команда форума
Посмотрел я твой пример аплоада файлов.
Дерьмовый, откровеннно говоря, пример.
Сейчас чувак на форум пришел, я его давай пинать - что у тебя за галиматья.
а он говорит - из вашего фака.
Блин.
Я сейчас 10 минут трахался, но так и не смог расставить скобки правильно.
Не маловато уровней вложенности? Чего уж мелочиться-то? двавй на два экрана вправо.
чтобы сразу и без мучений башку сложить, пытаясь разобраться.

тип файла проверяешь по расширению.
Дестинэйшен задаешь руками.

Такой грязный скрипт нельзя выставлять в обучение - ты уж извини.
Щас дам свой вариант.

Но, надо сказать, что у тебя есь огромное преимущество, которое с лихвой компенсирует мелкие недостатки кода.
Ты, в отличие от Бородина, поправки по просьбам трудящихся вносишь. :)
И за это тебе огромное спасибо
 

Фанат

oncle terrible
Команда форума
Значтак.
прошу уважаемое сообчество поглядеть на жти каракули и ткнуть носом, что здесь можно улучшить и поправить..
PHP:
<?php
$max_image_width  = 400;
$max_image_height  = 300;
$max_image_size   = 64 * 1024;
$valid_types  =  array(1=>'GIF',2=>'JPG',3=>'PNG');
$destination = "c:/";
$err="";

if ($_SERVER['QUERY_STRING']=='OK') {
  echo "File uploaded sucessfully.<br>";
  echo '<a href="'.$_SERVER['PHP_SELF'].'">Upload more</a>';
  exit;
}

if (isset($_FILES["userfile"])) {
  do {
    if (!is_uploaded_file($_FILES['userfile']['tmp_name'])) {
      $err="Error: empty file.";
      break;
    }
    $filename = $_FILES['userfile']['tmp_name'];
    $realname = $_FILES['userfile']['name'];
    if (filesize($filename) > $max_image_size) {
      $err="File size > ".($max_image_size/1024)."K.";
      break;
    }
    $size = GetImageSize($filename);
    if (!isset($valid_types[$size[2]])) {
      $err="Invalid file type. Walid are: ".implode(", ",$valid_types);
      break;
    }
    if ($size[0] > $max_image_width) {
      $err="Image Width > $max_image_width";
      break;
    }  
    if ($size[1] < $max_image_height) {
      $err="Image Height > $max_image_height";
      break;
    }
    if (!move_uploaded_file($filename, $destination.$realname)) {
      $err='File copy failed.';
      break;
    }
  } while(0); 

  if (!$err) {
    header("Location: ".$_SERVER['PHP_SELF']."?OK");
    exit;
  }
}
if ($err) echo "Error: $err";
?>
<form action="<? echo $_SERVER['PHP_SELF'] ?>" enctype="multipart/form-data" method="post"> 
  <input type="hidden" name="MAX_FILE_SIZE" value="500000"> 
  Send this file: <input name="userfile" type="file"> 
  <input type="submit" value="Send File"> 
</form>
принципиальные отличия от оригинала:
1. Сообщение об ошибке выводится не посреди скрипта, а где сказано.
2. Сообщение об ошибке присваивается под строкой, в которой ошибка произошла, а не на другом конце скрипта.
3. сообщения об ошибках детализированы и более информативны.
4. MAX_FILE_SIZE задрана побольше, чтобы не выдавалосе "Емпти филе"

возможно, кому-то милее бесчисленные вложенные ифы
Но в любом случае, даже с вложенными ифами, налдо проверять на отрицательный реультат и сообщение об ошибке выводить рядом.
мне мой ду-вайл, кстати, тоже не нравится.
Используется исключительно ради брейка.
Зато удобно будет переписать под функцию - возвращать фэлс или сообщение об ошибке.
В общем, жду критики.
 

Frol

Новичок
> мне мой ду-вайл, кстати, тоже не нравится.
if..elseif не прет?
 

Фанат

oncle terrible
Команда форума
неа.
я потому и взялся править этот скрипт, что запутался в огромном количестве скобок.
Не прибавляет понимания.
а скрипт учебный.

оригинал можеть посмотреть на детайле.
 

Frol

Новичок
PHP:
<?php
$max_image_width  = 400;
$max_image_height = 300;
$max_image_size   = 64 * 1024;
$valid_types      = array(1 => 'GIF',  2 => 'JPG', 3 => 'PNG');
$destination      = "c:/";
$err              = "";

if ($_SERVER['QUERY_STRING'] == 'OK') {
  echo 'File uploaded sucessfully.<br>';
  echo '<a href="'.$_SERVER['PHP_SELF'].'">Upload more</a>';
  exit;
}

if (isset($_FILES["userfile"])) {
  $filename = $_FILES['userfile']['tmp_name'];
  $realname = $_FILES['userfile']['name'];
  if (!is_uploaded_file($filename)) {
    $err = 'Error: empty file.';
  } elseif (filesize($filename) > $max_image_size) {
    $err = 'File size > '.($max_image_size / 1024)."K.";
  } else  {
    $size = getImageSize($filename);
    if (!isset($valid_types[$size[2]])) {
      $err = 'Invalid file type. Valid are: '. implode(', ', $valid_types);
    } elseif ($size[0] > $max_image_width) {
      $err = 'Image Width > '.$max_image_width;
    } elseif ($size[1] > $max_image_height) {
      $err = 'Image Height > '.$max_image_height;
    } elseif (!move_uploaded_file($filename, $destination.$realname)) {
      $err = 'File copy failed.';
    }
  }

  if (!$err) {
    header('Location: '.$_SERVER['PHP_SELF'].'?OK');
    exit;
  }
}
if ($err) echo 'Error: '.$err;
?>
<form action="<? echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="500000">
  Send this file: <input name="userfile" type="file">
  <input type="submit" value="Send File">
</form>
ИМХО лучше

style & bug fixed
 

Frol

Новичок
еше варианты... :)

PS над стилем кода надо поработать
 

Кром

Новичок
У меня предложение сделать из $err массив или конкатенировать с предыдущей ошибкой в виде:
$err .= 'Image Width > '.$max_image_width.'<br>';
Соответсвенно, отказаться от вложенных if при проверке ошибок.

Пример:
PHP:
if ($size[0] > $max_image_width)
{ 
      $err .= 'Image Width > '.$max_image_width.'<br>'; 
} 

if ($size[1] > $max_image_height)
{ 
      $err .= 'Image Height > '.$max_image_height.'<br>';
}

if (!$err)
{
 Выполняем сохранение
}

if (!$err)
{
 Выполняем переадресацию
}
Преимущества вижу в том, что пользователю отображается сразу все ошибки.
 

Фанат

oncle terrible
Команда форума
так было бы проще. это первый вариант, о котором думаешь.
И он работает, когда все ошибки имеют одинаковый вес - например, при заполнении полей формы.
Но здесь многие проверки теряют смысл, и даже могут вызывать ошибки.
И предложенный вариант стоит использовать разве что для размера файла-размера изображения.
фообще, похоже, можно сделать линейную структуру и убрать парочку ифов...
 

Falc

Новичок
У меня вызывает сомнение наличие проверки:
if (!is_uploaded_file($_FILES['userfile']['tmp_name'])) {
$err="Error: empty file.";
break;
}

Разве в массив $_FILES может попасть не закаченный через аплоад файл?
 

Фанат

oncle terrible
Команда форума
хэ зэ.
но, тем не менее, проверка такая есть.
Другое дело, что строить на ней всю дальнейшую обработку - неправильно.
Это проверка только на possible file attack

в общем, да.
похоже, ее можно прибить.
 

Falc

Новичок
Еще я не понимаю зачем в скрипт для обучения работы с аплоадом файлов добавлять (на мой взгляд достаточно кривую) работу с изображениями?
Зачем проверять макс. размеры изображения, когда можно его просто сресайзить?
 

Кром

Новичок
У меня такая версия:
PHP:
if (isset($_FILES["userfile"])) { 
  $filename = $_FILES['userfile']['tmp_name']; 
  $filesize = $_FILES['userfile']['size'];   
  
  if (!$filesize) {  	
  	 $err = 'No file.'; 
  } else {
  	  $size = getImageSize($filename); 
	  if (!isset($valid_types[$size[2]])) {
	    $err = 'Invalid file type. Valid are: '. implode(', ', $valid_types); 
	  } else {
	  	
	    if (filesize($filename) > $max_image_size) $err = 'File size > '.($max_image_size / 1024)."K."; 
	    if ($size[0] > $max_image_width) $err.= 'Image Width > '.$max_image_width; 
	    if ($size[1] > $max_image_height) $err.= 'Image Height > '.$max_image_height; 
	  }  
  }    
  if (!$err) {
    if (!move_uploaded_file($filename, $destination.$_FILES['userfile']['name'])) { 
      $err = 'File copy failed.'; 
    } else {  
      header('Location: '.$_SERVER['PHP_SELF'].'?OK'); 
      exit; 
    } 
  }
}
 

confguru

ExAdmin
Команда форума
Коль пошла такая пьянка - надо вынести
все в
function check_image($image_file,$image_tmp_file) {

Которая бы возвращала 0 - если с файлом все ок или текст ошибки
И уже после этого копировать файл
в нужное место
 

Falc

Новичок
>>Коль пошла такая пьянка - надо вынести
>>все в
>>function check_image($image_file,$image_tmp_file) {

В рамках учебника по закачке файлов мне кажется это лишним, но на практике может быть очен удобным.
 

Фанат

oncle terrible
Команда форума
насчет $filesize - интересная идея. я так понимаю, что имеется в виду $_FILES['userfile']['size']?
правда, проверка эта лишняя, поскольку то же самое делает b getimagesize
разве что, использовать это вместо is_uploaded_file

у меня другая засада, блин.

if (is_readable($_FILES['userfile']['tmp_name'])) $size = getImageSize($_FILES['userfile']['tmp_name']);
выдает Warning: getimagesize: Unable to open '' for reading!!!
А я ей так доверял....
4.2.3 win32
 
Сверху