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

fixxxer

К.О.
Партнер клуба
Я тоже под виндой... :)

Если варнинги критичны - то тогда мой последний вариант, наверное...
 

Фанат

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

.des.

Поставил пиво кому надо ;-)
Как насчет подобного разделения. Все таки error messages, которые возможно будет видеть пользователь смешивать с кодом не самое подходящее решение.


PHP:
if (isset($_FILES[$fieldname])) {
	$file=$_FILES[$fieldname]; 
	if(is_writeable($destination_dir) && 
	   move_uploaded_file($file['tmp_name'], $destination_dir.$file['name'])) {
		header('Location: '.$_SERVER['PHP_SELF'].'?OK'); 
		exit;
	}
	else {
		// Error Description
		$file['error'] == 4 && $err[] = "File wasn't uploaded yet"; 
		$file['error'] && $err[] = 'There was error while uploading file'; 
		$file['size'] == 0  && $err[] = 'File is empty'; 
		$file['size']>$max_size && 
		    $err[] = sprintf('File size %uK. But max %uK',$file['size']/1024, $max_size/1024);
		isset($err) || $err[] = "Unknown Error"; 
	}
}//if

if (isset($err)) echo '<b>Error:</b><br>'.implode('<br>',$err); ?>
А обработка всяких специфичных правил (images, etc...) через callback function если задана.
Например, в простых скриптах, простая функция upload куда мы помещаем любой код из вышеприведенных и которая в качестве параметра, кроме собственно filename, etc.., может принимать имя функции и параметры для нее. Далее - [m]call_user_func_array[/m]

Сложность состоит именно получении осмысленных сообщений об ошибках.
Каждый наверное встречался с тем, чтобы поправить и/или добавить те или иные сообщения или добавить еще несколько проверок приходится править прямо посреди стройной логики.
for example:
PHP:
/* image check begin. Can be removed */ 
  } elseif ($err.= check_image($file['tmp_name'],$max_image_width,$max_image_height)) { 
/* image check end */
После пары тройки таких правок код становится лоскутным.

Но наверное это тема отдельного разговора... мде.. 5.30 утра а я еще не сплю :)
 

fixxxer

К.О.
Партнер клуба
Мне все же кажется, что конструкции наподобие
PHP:
$file['error'] == 4 && $err[] = "File wasn't uploaded yet"
слишком замысловаты для новичков.
 

Фанат

oncle terrible
Команда форума
я не настаиваю на своей структуре, но вариант .des. мне не нравится.

Вообще, я склоняюсь к тому, что сделать отдельную функцию проверок закаки (все, что до картинки) и дельше 3 строчки -
checkUpload
checkImage
move_uploaded_file
 

fixxxer

К.О.
Партнер клуба
Я бы checkImage тогда уж сделал callback функцией, ибо проверяться может, собственно, все что угодно, например tar архив...
 

fixxxer

К.О.
Партнер клуба
О, des уже примерно это же и предложил..

Тут есть узкое место - getimagesize от файла из /tmp, конечно, сработает. А вот fopen с чтением заголовка с большой вероятностью будет зарублен ограничениями safe mode, и тут часто единственный выход - сначала move_uploaded_file, потом check, а потом если надо unlink. То есть, callback-функция, получается, нужна фактически только в случае getimagesize... Итого, callback-функции нам не особенно-то нужны. :)
 

fixxxer

К.О.
Партнер клуба
Давайте решим, что мы хотим в итоге сделать.
Универсальный скрипт, который можно будет тупо скопипейстить?
Или, все же, более-менее читабельный код, на примере которого можно самому научиться обрабатывать аплоады?
Во втором случае, со всеми этими наворотами мы уходим от сути (move_uploaded_file), и новичку сквозь все эти тридцать три проверки будет нелегко продираться.
В первом случае - а оно надо?
 

Фанат

oncle terrible
Команда форума
эх.
так что решим, отцы?

следуя моему любимому принципу "не делить и отнимать" - фиксер, а почему бы не сделать оба варианта?

не хочешь попробовать изобразить?
 

Фанат

oncle terrible
Команда форума
Юкко, мой код нечитабельный?

чего ты "+1"?
здесь ресторан что ли?
или ты думаешь, что есть специальный человек, который будет твои плюсодины реализовывать?

просить сделать тебя не буду. мал ты еще.

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


И вообще.
Если вернуться к самым первым баранам.
Тот код, что я здесь привел - редакция кода янга из статьи
причем я готов объяснить - что мне не нравится у Янга (правда, забыл давнг, ну да погляжу - вспомню :)
А минимальный читабельный код есть в мане.
Ы?
 

Фанат

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

Давай его поставим?
Но, если даже и неа него находятся критики, все равно лушче. Структурнее.

И, плюс, желательно добавить пример из мана, там где мув аплоадед файл. Ну, как фиксер предлагал - САМЫЙ простой.

А то сейчас ВСЕ используют приведенный сейчас пример не как пример, а как готовый код.
Ну пусть он хотя бы будет попричесанней?
 

fixxxer

К.О.
Партнер клуба
Автор оригинала: Фанат
эх.
так что решим, отцы?

следуя моему любимому принципу "не делить и отнимать" - фиксер, а почему бы не сделать оба варианта?

не хочешь попробовать изобразить?
Как пример "сложного" варианта вполне подойдет твой.

А простой - ну, например, так:
PHP:
<?
  define(DESTINATION_DIR, 'c:/');

  if (isset($_FILES['userfile'])) {
    if ($_FILES['userfile']['error'] || $_FILES['userfile']['size']==0) {
      $err = 'An error has occurred during upload';
    } elseif (!move_uploaded_file($_FILES['userfile']['tmp_name'], DESTINATION_DIR.$_FILES['userfile']['name'])) { 
      $err = 'An error has occurred while saving the uploaded file on server';
    } else {
      header('Location: '.$_SERVER['PHP_SELF'].'?OK');
      exit;
    }
    echo "<font color=red>" . $err . "</font><br>\n";
  } elseif ($_SERVER['QUERY_STRING']=='OK') {
    echo "The upload completed succesfully<br>\n";
  }
 
?>
<form method="post" enctype="multipart/form-data">
  File to upload: <input name="userfile" type="file"><br>
  <input type="submit" value="Upload File">
</form>
 

young

Новичок
так что мы решили?

Какой пример публиковать на деталях?
 
Сверху