Струва си да допълним тази празнина, като разгледаме кодовете за грешки по време на трансфер. Тях държи ключ:
$_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(). Функцията има следния формат:
$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" може да се промени на нещо по-логично за потребителя - файла успешно качен.
Пример, когато Сульо качва нищо на сайта на Пульо.
В най-общ вид нещата получават следния облик:
<?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>
до нови срещи ^.^
Честита Нова година!
Здраве и много манекенски успехи в света на IT :))
Благодаря за пожеланието. ЧНГ и на тебе fedora. Щелкунчик от Чайковски е музикалния поздрав за теб. За много години...
Честита Нова Година и от мен. Всеки край е начало и обратното. Всяка година е като поправителна сесия, където ти се дава шанс да се представиш по-добре. А накрая всички минаваме. Писах ти за Сметана-та след като се върнах към цивилизацията, разбирай нета вкъщи, но май получаваш известия.
Тук вече са популярни пързалките и ходенето на ски. Нашенските бели мечки биха прегряли в тропическият ти Рай. Мека и лека зима :)