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

Фанат

oncle terrible
Команда форума
кстати, еще мне не нравится это 'userfile'
оно используется чуть ли не как константа.
 

Фанат

oncle terrible
Команда форума
А что в эту функцию включать?

А еще у нас есть поле $_FILES['userfile']['error']...
и, в связи с этим, похоже, что is_uploaded_file - это такой же анахренизм, как session_register...
 

Фанат

oncle terrible
Команда форума
Вообще, кстати.
вся эта мутотень с картинками - лишняя.
У нас статья, как файлы аплоадить. А не только картинки.
Так что, надо сделать нормальный пример аплоада файлов.
Любых.

А после него, при желании - его же, но для картинок, с функцией check_image_params
 

Falc

Новичок
>>У нас статья, как файлы аплоадить. А не только картинки.
>>Так что, надо сделать нормальный пример аплоада файлов.

Во-во и я про тоже, картинки это уже совсем другая истроия, там другие проблемы и возможности.
 

Фанат

oncle terrible
Команда форума
что в функции хорошо, нет, просто замечетнльно - это оператор return
PHP:
function check_image($filename,$max_width,$max_height,$valid_types="") {
  $err = '';
  if (!is_array($valid_types)) $valid_types=array(1 => 'GIF',  2 => 'JPG', 3 => 'PNG'); 

  if (!is_readable($filename)) return "Server error"; 
  $info = getImageSize($filename);
  if (!isset($valid_types[$info[2]])) {
    return 'Invalid file type. Valid are: '. implode(', ', $valid_types); 
  }
  if ($info[0] > $max_width) $err = 'Image Width > '.$max_width.' pixels <br>'; 
  if ($info[1] > $max_height) $err.= 'Image Height > '.$max_height.' pixels'; 
  return $err;
}

$err = check_image($filename,$max_image_width,$max_image_height);
Универсальная функция, не только, в общем, для аплоада.
Годится?
 

Falc

Новичок
Скжите мен пожалуйста зачем делать такие проверки:
if (filesize($filename) > $max_image_size) $err = 'File size > '.$max_size.'K.<br>';
if ($info[0] > $max_width) $err.= 'Image Width > '.$max_width.' pixels <br>';
if ($info[1] > $max_height) $err.= 'Image Height > '.$max_height.' pixels <br>';


Если можно просто сресайзить картинку.
 

Фанат

oncle terrible
Команда форума
Falc, а если не можно?
А ты уверен, что вопрос ресайза картинок входит в рамки статьи про аплоад файлов?
А ты уверен, что после ресайза размер файла все равно не будет превышать допустимый?
А ты уверен, что ресайзить вообще допустимо и ресайз не испортит нахрен весь авторский замысел?
 

Фанат

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

young

Новичок
Господа, я пока временно безработный, сессия, все такое.
По сему иногда могу реагировать медленно.


А с примером вы решите, и конечный вариант скиньте на почту, ок?
 

Фанат

oncle terrible
Команда форума
Спасибо, янг, обязательно скинем.
Пользуясь случаем, хочу перед тобой извиниться.
В документации действительно написано, что MAX_FILE_SIZE is advisory to the browser
Давно я туда не заглядывал и зря тебя оговорил.

Получается, что из примера надо бы убрать это поле, а в примечании добавить, что если аплоад не проходит, то можно попробовать его добавить.
 

Falc

Новичок
Фанат
>>А ты уверен, что вопрос ресайза картинок входит в рамки статьи про аплоад файлов?
Я считаю что все проверки связанные с картинками выходят за пределы данной статьи.

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

>>А ты уверен, что ресайзить вообще допустимо и ресайз не испортит нахрен весь авторский замысел?
Нет не уверен, ресайз это просто 1 из вариантов обработки закачиваемых картинок, так же как и приведеный тобой выше. Просто если расматривать конкретные примеры обработки картинок, тогда лучше расмотреть как можно больше таких примеров. Иначе новичек может подумать, что только так и следует обрабатывать картинки и никак иначе.
 

fixxxer

К.О.
Партнер клуба
Думаю, что вообще не стоит наворачивать с картинками.

Статья-то о аплоаде файлов. А не о картинках.

Не надо грузить новичков сразу еще и картинками с их размерами и ресайзами. :)
 

Фанат

oncle terrible
Команда форума
Короче. вот что получилось
Мне нравится.
PHP:
<?php 
$destination_dir  = "c:/"; 
$err              = ""; 
$fieldname        = "userfile";
$max_file_size    = 64 * 1024;
$max_image_width  = 800; 
$max_image_height = 600;

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

if (isset($_FILES[$fieldname])) {
  $file=$_FILES[$fieldname];
  if ($file['error'] == 4) {
    $err = "File wasn't uploaded yet";
  } elseif ($file['error']) {
    $err = 'There was error while uploading file'; 
  } elseif ($file['size'] == 0) {
    $err = 'File is empty'; 
  } elseif ($file['size'] > $max_file_size) {
    $size = ceil($file['size'] / 1024);
    $err = 'File size is '.$size.'K but maximum is '.($max_file_size / 1024)."K<br>";  
/* image check begin. Can be removed */
  } elseif ($err.= check_image($file['tmp_name'],$max_image_width,$max_image_height)) { 
/* image check end */
  } elseif (!is_writable($destination_dir.$file['name'])) { 
    $err = 'Server error 1.'; 
  } elseif (!move_uploaded_file($file['tmp_name'], $destination_dir.$file['name'])) { 
    $err = 'Server error 2.'; 
  } else { 
    header('Location: '.$_SERVER['PHP_SELF'].'?OK'); 
    exit; 
  } 
} 
if ($err) echo '<b>Error:</b><br>'.$err; 
?> 
<form action="<? echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post"> 
  Send this file: <input name="<? echo $fieldname; ?>" type="file"> 
  <input type="submit" value="Send File"> 
</form> 
<?
function check_image($filename,$max_width,$max_height,$valid_types="") {
  $err = '';
  if (!$valid_types) $valid_types=array(1 => 'GIF',  2 => 'JPG', 3 => 'PNG'); 

  if (!is_readable($filename)) return "Server error"; 
  $info = getImageSize($filename);
  if (!isset($valid_types[$info[2]])) {
    return 'Invalid file type. Valid are: '. implode(', ', $valid_types); 
  }
  if ($info[0] > $max_width) {
    $err = 'Image Width is '.$info[0].' pixels but maximum is '.$max_width.'<br>'; 
  }
  if ($info[1] > $max_height) { 
    $err.= 'Image Height is '.$info[1].' pixels but maximum is '.$max_height.'<br>'; 
  }
  return $err;
}
?>
 

Фанат

oncle terrible
Команда форума
Falc, ты путаешь обработку картинок и обработку аплоада картинок.
Это большая разница.
И, скажу тебе по секрету - я буду просто щаслив, если кто-то решит, что картинки нельзя ресайзить и не попрется с этим вопросом на форум :)
 

Falc

Новичок
Фанат
>>Falc, ты путаешь обработку картинок и обработку аплоада картинок.
Не вижу смысла во втором если присутствует первое, я лично в 1 строчку ресайзю обрабатываю и копирую картинки в нужную папку, вызывая утилитку convert из пакета imagemagick. Необходимость обработки аплоада пропадает сама собой.

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

Фанат

oncle terrible
Команда форума
это два разных экрана кода.
Если ты не понял.
Перечитай тему.
 

Макс

Старожил PHPClub
Фанат
а где-же
<input type="hidden" name="MAX_FILE_SIZE" value="1024000">

и ИМХО $_FILES['file']['error'] через switch лучше обрабатывать:
PHP:
switch ($_FILES['file']['error']) {
   case UPLOAD_ERR_INI_SIZE || UPLOAD_ERR_FORM_SIZE :
       $errors['file'] = _("File must be lesser than 100 kB");
       break;
   case UPLOAD_ERR_PARTIAL:
       $errors['file'] = _("There was error while uploading file");
        break;
   case UPLOAD_ERR_NO_FILE:
        $errors['file'] = _("File wasn't uploaded yet");
}
 

Фанат

oncle terrible
Команда форума
а гдеже
<input type="hidden" name="MAX_FILE_SIZE" value="1024000">
MAX_FILE_SIZE is advisory to the browser
Поскольку, во всяком случае, мой браузер чихать хотел на эту директиву, я написал янгу чуть выше следующее:
Получается, что из примера надо бы убрать это поле, а в примечании добавить, что если аплоад не проходит, то можно попробовать его добавить.
возражения?

По поводу обработки ошибок.
Если ты заметил, я их особо не обрабатываю.
Но даже если и буду, то уж никак не этим идиотским кейсом.
У меня идиосинкразия к кейсам.
Я никогда не пойму, почему вместо того, чтобы сделать примитивный массив, надо рисовать эти кусты с брейками.

Я понимаю, что у некоторых людей страсть примитивную операцию растянуть на пол-экрана.
Но вот другие люди мне пеняют, что скрипт и так уже великоват.

И кейс не ложится в стройную структуру скрипта.
 

fixxxer

К.О.
Партнер клуба
PHP:
(!is_writable($destination_dir.$file['name']))
Вот этот фрагмент вызывает подозрение.
Насколько мне не изменяет память, функция is_writable возвращает true только в том случае, если указанный файл существует && возможна запись в него. Похоже, что всегда в том случае, если файл с таким именем еще не был залит, будет выдаваться "Server error 1"...

//сейчас проверю, to be edited

edited: да, так и есть.
можно заменить на
PHP:
} elseif (!is_writable($destination_dir)) {
(проверяем, доступен ли каталог для записи)
или просто убрать эту проверку - в любом случае move_uploaded_file вернет ошибку, если прав нет...

еще вариант -
PHP:
} elseif (file_exists($destination_dir.$file['name']) && !is_writable($destination_dir.$file['name'])) {
но это уже какие-то совсем параноидальные проверки получаются :)
 

Фанат

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