Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...


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. зайче Said,

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

     

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

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

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