Punta de Choros

27 декември 2009

На 2009г й оставаха 120ч съществуване. От календара падна поредния лист с дата 27 декември и към 10.30ч сутринта ме събуди звън от телефона.

Инсталация на Microsoft шрифтове в Ubuntu 16.04

14 януари 2017

нсталация на Microsoft шрифтове в Ubuntu се поражда от идеята браузърите в различните системи, да показват еднакво текстовото съдържанието на интернет страниците.

Ubuntu 16.04 инсталация на USB disk on Key

19 ноември 2016

Арсеналът ми от мобилни компютри съдържа Fujitsu Lifebook AH530. Това е бюджетна машина от 2011г на Intel Core i5-480M процесор и 4GB DDR3 RAM памет.

gparted

Paragon ExtFS for Windows

30 юли 2016

ExtFS for Windows е утилита на Paragon Software разработена през 2013г. Тя представлява решение, предоставящо пълен достъп на четене и на запис до раздели ...

msvcr100.dll is missing Windows 10

04 октомври 2016

Майк Патерсън от Plixer, компания по компютърната сигурност, публикува доклад , че Windows 10 изпраща данни в криптиран вид от вашата машина на всеки пет минути. Той е направил максимума, за да спре изтичането, но системата продължавала да изпраща информация.


PHP Upload Form е тема, в която разгледах начин за качване на файл по http протокол. Тестът се проведе на localhost и главно отличие е гладкост и безпроблемност. Възможно е на реален уеб-хост сценария да не протече по същия начин, а това на свой ред ще породи грешки, които с лека река съм подминал в предната тема.

Струва си да допълним тази празнина, като разгледаме кодовете за грешки по време на трансфер. Тях държи ключ:
$_FILES['uploadfile']['error'].

Ревизия на Multipart-форма


Максималният размер на файла в байтове трябва да бъде деклариран преди поле input type="file" и не може да бъде по-голям от upload_max_filesize, зададен в php.ini. Един вид html формата казва на PHP - хей, приятел изпращам ти файл по-малък от възможното. В противен случай PHP ще спре, ако лимита надхвърля възможното.

Справка:
1 megabyte е равен на 1 048 576 bytes.

Постигане на декларацията става чрез допълнителна декорация на формата с скрито поле на име MAX_FILE_SIZE.

html код на формата
<form action="upload.php" method="POST" enctype="multipart/form-data">
 <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
 <input type="file" name="uploadfile">
 <input type="submit" value="upload">
</form>

Константа в PHP


Има случаи, когато е неудобно ползване на променливи за постоянно съхранение на значения, които на свой ред не се променят до края на работа на скрипта. Например, математически константи, пътища към файлове, пароли и т.н. За тази цел PHP предлага конструкция наречена константа.

Константа се нарича именувана величина, която не се променя в процеса на изпълнение на програмата.

Това на свой ред налага ограничения. Веднъж зададени тези значения, не могат да бъдат променяни. Константите могат да съдържат само скаларни данни (логически, цели числа, числа с плаваща запетая и изрази).

В РНР константите се определят с функция define(). Функцията има следния формат:

define ($name, $value, $case_sen)

$name - имe на константата;
$value - значение на константата;
$case_sen - незадължителен логически тип параметър, отчитащ регистъра на буквите (true) или не (false).

Пример за определяне и обръщение към константа:
<?php
 define("PI",3.14,true);
 echo PI; // извежда 3.14
?>

Добра практика е константите да се пишат с главни букви (според прието съглашение) и следва да се помнят следните особености при работа с тях:
  • У константите няма представка знак $;
  • Константите могат да бъдат определени в произволно място и извикани без да се отчита област на видимост;
  • Името на константа трябва да бъде заключено в кавички, а не апострофи;
  • Не се допуска две константи с едно и също име;
  • Константата не може да бъде анулирана, след като е зададена.

Казаното о константите е с уговорка, че третирам процедурен код. Магически константи и константи зададени в класове с конструкция const не са обект на темата.

Error Messages


Стигнахме и до същината на проблема. Според php.net от версия PHP 4.3.0 се появяват следните константи.

Константа Значение Описание
UPLOAD_ERR_OK 0 There is no error, the file uploaded with success.
UPLOAD_ERR_INI_SIZE 1 The uploaded file exceeds the upload_max_filesize directive in php.ini.
UPLOAD_ERR_FORM_SIZE 2 The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.
UPLOAD_ERR_PARTIAL 3 The uploaded file was only partially uploaded.
UPLOAD_ERR_NO_FILE 4 No file was uploaded.
UPLOAD_ERR_NO_TMP_DIR 6 Missing a temporary folder. Introduced in PHP 4.3.10 and PHP 5.0.3.
UPLOAD_ERR_CANT_WRITE 7 Failed to write file to disk. Introduced in PHP 5.1.0.
UPLOAD_ERR_EXTENSION 8 A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help. Introduced in PHP 5.2.0.

Те връщат код на грешката при качване на файл. Този код може да бъде прочетен от масив, създаван от PHP при обръщение към ключ error.

Пропускът, когото отчитам тук е, че в предходната тема (спомената в началото) не отчитам възможни грешки. На localhost всичко протича гладко. На практика получавам UPLOAD_ERR_OK ([error] => 0).

В най-прост вариант следва да се добави подобна проверка.

<?php
 if($_FILES['uploadfile']['error']==0) {
   // процедираме нататък
 } else {
   // обработваме грешката
 }
?>

Но, ако искаме да покажем конкретна грешка на потребителя при неуспешно качване на файл, не пречи да постъпим така. Създаваме масив, в когото изброяваме конкретните грешки от таблицата.

$upload_errors = array(
 UPLOAD_ERR_OK           => "No errors.",
 UPLOAD_ERR_INI_SIZE     => "Larger than upload_max_filesize.",
 UPLOAD_ERR_FORM_SIZE    => "Larger than form MAX_FILE_SIZE.",
 UPLOAD_ERR_PARTIAL      => "Partial upload.",
 UPLOAD_ERR_NO_FILE      => "No file.",
 UPLOAD_ERR_NO_TMP_DIR   => "No temporary directory.",
 UPLOAD_ERR_CANT_WRITE   => "Can't write to disk.",
 UPLOAD_ERR_EXTENSION    => "File upload stopped by extension."
);

Особеното на масива е ключовете на елементите му заменени от константи. Ако проследите значенията се губи поредността. Липсва 5, от 4 скачаме на 6. И ако се върнем на примера с дефиниране на константа и видим какво извежда, то мислете за масива все едно е зададен така.

$upload_errors = array(
 0 => "No errors.",
 1 => "Larger than upload_max_filesize.",
 2 => "Larger than form MAX_FILE_SIZE.",
 3 => "Partial upload.",
 4 => "No file.",
 6 => "No temporary directory.",
 7 => "Can't write to disk.",
 8 => "File upload stopped by extension."
);

ОК, тогава нека уловим грешката връщана от ключ error и я покажем на потребителя.

 $error = $_FILES['uploadfile']['error'];
 $message = $upload_errors[$error];

В обособено място около формата ще извеждаме $message. Разбира се "No errors" може да се промени на нещо по-логично за потребителя - файла успешно качен.

Пример, когато Сульо качва нищо на сайта на Пульо.
error upload

В най-общ вид нещата получават следния облик:
<?php

$upload_errors = array(
 UPLOAD_ERR_OK    => "No errors.",
 UPLOAD_ERR_INI_SIZE   => "Larger than upload_max_filesize.",
 UPLOAD_ERR_FORM_SIZE  => "Larger than form MAX_FILE_SIZE.",
 UPLOAD_ERR_PARTIAL   => "Partial upload.",
 UPLOAD_ERR_NO_FILE   => "No file.",
 UPLOAD_ERR_NO_TMP_DIR   => "No temporary directory.",
 UPLOAD_ERR_CANT_WRITE   => "Can't write to disk.",
 UPLOAD_ERR_EXTENSION  => "File upload stopped by extension."
);

if(isset($_POST['submit'])) {

 $tmp_file = $_FILES['uploadfile']['tmp_name'];
 $filename = basename($_FILES['uploadfile']['name']);
 $upload_path = './files/';
  
 // Проверка с file_exists() да не би да има
 //файл с същото име.
 
 if(move_uploaded_file($tmp_file, $upload_path . $filename)) {
  //$_FILES['uploadfile']['error'] == 0
  $message = "File uploaded successfully.";
  
 } else {
  //$_FILES['uploadfile']['error'] > 0
  //съобщение за грешка
  $error = $_FILES['uploadfile']['error'];
  $message = $upload_errors[$error];
 }
} 
?>
<html>
 <head>
  <title>Upload</title>
 </head>
 <body>
 
  <?php if(!empty($message)) { echo "<p>{$message}</p>"; } ?>
  
 <form action="upload.php" method="POST" enctype="multipart/form-data">
  <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
  <input type="file" name="uploadfile">
  <input type="submit" value="upload">
 </form>
 
 </body>
</html>






до нови срещи   ^.^

31.12.2011 profruit 

3 Response to "File Upload Error Messages"

  1. fedora Said,

    Честита Нова година!
    Здраве и много манекенски успехи в света на IT :))

     

  2. Profruit Said,

    Благодаря за пожеланието. ЧНГ и на тебе fedora. Щелкунчик от Чайковски е музикалния поздрав за теб. За много години...

     

  3. am-am Said,

    Честита Нова Година и от мен. Всеки край е начало и обратното. Всяка година е като поправителна сесия, където ти се дава шанс да се представиш по-добре. А накрая всички минаваме. Писах ти за Сметана-та след като се върнах към цивилизацията, разбирай нета вкъщи, но май получаваш известия.
    Тук вече са популярни пързалките и ходенето на ски. Нашенските бели мечки биха прегряли в тропическият ти Рай. Мека и лека зима :)

     

Публикуване на коментар

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: Ubuntu, WEB, Photoshop, Фотография, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога