Написване на клас за File Upload. Част 3

Продължаваме от Част 2. Function #8 (Verify The Upload Log Directory)

<?php
function get_upload_log_directory() {
$upload_log_dir = trim($this->upload_log_dir);
if ($upload_log_dir) {
$ud_len = strlen($upload_log_dir);
$last_slash = substr($upload_log_dir,$ud_len-1,1);
if ($last_slash <> "/") {
$upload_log_dir = $upload_log_dir."/";
} else {
$upload_log_dir = $upload_log_dir;
}
$handle = @opendir($upload_log_dir);
if ($handle) {
$upload_log_dir = $upload_log_dir;
closedir($handle);
} else {
$upload_log_dir = "ERROR";
}
} else {
$upload_log_dir = "ERROR";
}
return $upload_log_dir;
}
?>


Няма да разбиваме функцията. Причината е, защото това е същата функция през която преминахме, с изключение че тя валидира и връща upload log directory. Какво е upload log directory? Това е directory , която определяте при извикване на class-а, за да се разполагат всички log files в нея. Всеки път, когато юзера ъплоудва файл, .txt файл е записван на server-а с текущата дата. Ако файла вече съществува за текущата дата we just append the data в края, иначе стартираме нов файл.

Причината: кой, какво и кога ъплоудва. Ако някой upload-не virus, ще имате възможност да проследите юзера и да вкарате him/her в забранения списък. Това е идеална функция за всеки клас(да я притежава) или script поради това, че се занимава с взаимодействието между публиката и сървъра.

------------------

Function #9 (Upload The File With No Validation)

<?php
function upload_file_no_validation() {
//SECTION #1
$temp_file_name = trim($this->temp_file_name);
$file_name = trim(strtolower($this->file_name));
$upload_dir = $this->get_upload_directory();
$upload_log_dir = $this->get_upload_log_directory();
$file_size = $this->get_file_size();
$ip = trim($_SERVER['REMOTE_ADDR']);
$cpu = gethostbyaddr($ip);
$m = date("m");
$d = date("d");
$y = date("Y");
$date = date("m/d/Y");
$time = date("h:i:s A");

//SECTION #2
if (($upload_dir == "ERROR") OR ($upload_log_dir == "ERROR")) {
return false;
} else {
if (is_uploaded_file($temp_file_name)) {
if (move_uploaded_file($temp_file_name,$upload_dir . $file_name)) {
$log = $upload_log_dir.$y."_".$m."_".$d.".txt";
$fp = fopen($log,"a+");
fwrite($fp,"
$ip-$cpu | $file_name | $file_size | $date | $time");
fclose($fp);
return true;
} else {
return false;
}
} else {
return false;
}
}
}
?>



Това е една от двете ключови функции в този class. Тази функция и следващата са тези, които ще опитат upload на Вашия файл. Уффффф, най-накрая. След 8 предварителни функции и 'x' броя реда код, започваме да напипваме хубавата част. Тази функция ще upload-не Вашия файл, валидация на файла или на юзера. Единственото нещо, което утвърждава са (2) директории за upload. Ако са некоректни, файла няма да се upload-не. Ако не Ви "дреме" за размера на файла, типа му, юзерите, или дали файла съществува, тогава използувайте тази функция за upload.

Функцията е разделена на (2) части с цел по-лекото и усвояване. Да хвърлим един поглед, какво може да става вътре в една такава функция.

<?php
//SECTION #1
$temp_file_name = trim($this->temp_file_name);
$file_name = trim(strtolower($this->file_name));
$upload_dir = $this->get_upload_directory();
$upload_log_dir = $this->get_upload_log_directory();
$file_size = $this->get_file_size();
$ip = trim($_SERVER['REMOTE_ADDR']);
$cpu = gethostbyaddr($ip);
$m = date("m");
$d = date("d");
$y = date("Y");
$date = date("m/d/Y");
$time = date("h:i:s A");
?>


Section #1
Функцията трябва да дефинира (12) различни променливи, за да може партито да започне. Долу е показан списък с променливите, с кратко описание към тях.

$temp_file_name = The temporary file name taken from the file that needs to be uploaded.
$file_name = The actual file name taken from the file that needs to be uploaded.
$upload_dir = The upload directory returned by the get_upload_directory() function.
$upload_log_dir = The upload directory returned by the get_upload_log_directory() function.
$file_size = The readable file size returned from the get_file_size() function.
$ip = The user's IP address.
$cpu = The user's internet host or (ISP)
$m = The current month in (2) digit format. (ie. 01)
$d = The current day in (2) digit format. (ie. 01)
$y = The current year in (4) digit format. (ie. 2003)
$date = Today's date as 01/01/2003
$time = The current time as 11:12:56 AM


<?php
//SECTION #2
if (($upload_dir == "ERROR") OR ($upload_log_dir == "ERROR")) {
return false;
} else {
if (is_uploaded_file($temp_file_name)) {
if (move_uploaded_file($temp_file_name,$upload_dir . $file_name)) {
$log = $upload_log_dir.$y."_".$m."_".$d.".txt";
$fp = fopen($log,"a+");
fwrite($fp,"
$ip-$cpu | $file_name | $file_size | $date | $time");
fclose($fp);
return true;
} else {
return false;
}
} else {
return false;
}
}
}
?>



Section #2
Това е секцията от кода в която магията се случва. Тя стартира процесите на валидация и upload. Първо прави проверка да се убеди че upload директориите са валидни, и ако не са, функцията връща false и exits, иначе продължаваме към следващия validation процес.

Искаме да се убедиме, че файла се е upload-нал в temp directory. Вижте във Вашият php.ini файл, секцията питаща за temp upload directory и където файла се upload-ва. След като е upload-нат, трябва да го вземеме от тази директория и да го преместиме в коректната директория. Така че правиме проверка за да се убедиме че файла се е upload-нал във temp директорията с използуването на функцията is_uploaded_file(). Ако се е ъплоуаднал продължаваме, в противен случай функцията връща false и завършва.

Сега трябва да провериме дали файла е имал възможността да бъде преместен от temp directory във коректната директория, като използуваме функцията move_uploaded_file(). Ако е, тогава upload-а е готов, функцията връща true, и е въведен запис в днешния(текущия) log file. log file се съхранява за всеки ден, когато е ъплоудван файл. Всеки log file ще бъде с името на текущата дата. (т.е. 07192003.txt) Ако файла вече съществува, добавяме data to the end of the file, иначе стартираме нов файл. Във всеки log file информацията, която се съхранява е ip адреса, интернет провайдъра, името на файла, размера на файла, датата на upload, и времето на upload разделени с '|'.

Ако преместването на файла пропадне функцията ще върне false и след това exit. Нека отидем сега на последната функция за този class.

Function #10 (Upload The File With Validation)

<?php
function upload_file_with_validation() {
//SECTION #1
$temp_file_name = trim($this->temp_file_name);
$file_name = trim(strtolower($this->file_name));
$upload_dir = $this->get_upload_directory();
$upload_log_dir = $this->get_upload_log_directory();
$file_size = $this->get_file_size();
$ip = trim($_SERVER['REMOTE_ADDR']);
$cpu = gethostbyaddr($ip);
$m = date("m");
$d = date("d");
$y = date("Y");
$date = date("m/d/Y");
$time = date("h:i:s A");
$existing_file = $this->existing_file(); //<-Add On
$valid_user = $this->validate_user(); //<-Add On
$valid_size = $this->validate_size(); //<-Add On
$valid_ext = $this->validate_extension(); //<-Add On

//SECTION #2
if (($upload_dir == "ERROR") OR ($upload_log_dir == "ERROR")) {
return false;
}
elseif ((((!$valid_user) OR (!$valid_size) OR (!$valid_ext) OR ($existing_file)))) {
return false;
} else {
if (is_uploaded_file($temp_file_name)) {
if (move_uploaded_file($temp_file_name,$upload_dir . $file_name)) {
$log = $upload_log_dir.$y."_".$m."_".$d.".txt";
$fp = fopen($log,"a+");
fwrite($fp,"
$ip-$cpu | $file_name | $file_size | $date | $time");
fclose($fp);
return true;
} else {
return false;
}
} else {
return false;
}
}
}
?>



Тази функция е същата, като една от тези които разгледахме, с изключение че добавя допълнителни 6 реда код. Имаме (4) new променливи в section #1. Всеки един е показан долу с кратко описание.

$existing_file = Returns true if the current file name already exists, false if not.
$valid_user = Returns the outcome of if the user is valid or not.
$valid_size = Lets the function know if the file size is valid.
$valid_ext = Calls the validate_extension() function to validate the file's extension.
Тези (4) реда са необходими, така че можем да валидираме дали да допуснем файла за upload. Друг добавен ред от кода е в Section #2 и е показан долу.

<?php
elseif ((((!$valid_user) OR (!$valid_size) OR (!$valid_ext) OR ($existing_file)))) {
return false;
?>


Това са нашите bread и butter от validation process. If проверява дали user is valid, file size is valid, file extension is valid и дали файла вече съществува на server-а. Ако всички проверки са okay, се преминава към същия process описан преди за upload на файл и запис на нов ред в log file-а за тази дата. Сега всичко, което трябва да направиме е да извикаме class-а.

------------------

Извикване на Class-а

Включването на класа във Вашия файл става с include() функцията. Долу е процеса на извикване на class-а.





<?php
//SECTION #1
$upload_class = new Upload_Files;
$upload_class->temp_file_name = trim($_FILES['upload']['tmp_name']);
$upload_class->file_name = trim(strtolower($_FILES['upload']['name']));
$upload_class->upload_dir = "uploads/";
$upload_class->upload_log_dir = "uploads/upload_logs/";
$upload_class->max_file_size = 524288;
$upload_class->banned_array = array("");
$upload_class->ext_array = array(".jpg",".gif",".jpeg",".png");

//SECTION #2
$valid_ext = $upload_class->validate_extension();
$valid_size = $upload_class->validate_size();
$valid_user = $upload_class->validate_user();
$max_size = $upload_class->get_max_size();
$file_size = $upload_class->get_file_size();
$upload_directory = $upload_class->get_upload_directory();
$upload_log_directory = $upload_class->get_upload_log_directory();
$upload_file = $upload_class->upload_file_with_validation();
?>


Section #1
В първа секция, трябва да стартираме class-а и да дефинираме нашите class променливи. Когато стартирате new копие на class-а, трябва да зададете променлива за класа. В този случай нашата main class променлива е $upload_class, и тогава стартираме класа. (new Upload_Files) Напишете new за да може PHP да разбере, че стартирате new class and call the class name. След това трябва да дефинираме всички променливи за нашия class. За дефиниране на променливите, трябва да стартираме с нашата main class променлива( в този случай $upload_class). Трябва да оставите PHP да разбере, че вашето желание е тази променлива да бъде изпратена на class-а и just not defined in the script. Припомнете си, в самото начало на class-а, променливите които бяха дефинирани. Е сега ще ги активираме. Да направим бърз преглед на всяка променлива.

$upload_class->temp_file_name = trim($_FILES['upload']['tmp_name']); [set the temp file name]
$upload_class->file_name = trim(strtolower($_FILES['upload']['name'])); [set the actual file name]
$upload_class->upload_dir = "uploads/"; [set the upload directory]
$upload_class->upload_log_dir = "uploads/upload_logs/"; [set the upload log directory]
$upload_class->max_file_size = 524288; [set the max file size - .5MB or 512KB]
$upload_class->banned_array = array(""); [set the banned users array]
$upload_class->ext_array = array(".jpg",".gif",".jpeg",".png"); [set the acceptable file extensions]
Не е нужно да дефинирате всяка променлива, ако не планирате да използувате validation scripts. Ако ще правите само upload, се нуждаете само от първите (4) променливи, вместо от всичките (7). Още помнете, че ако нямате списък със забранени юзери, няма нужда да дефинирате такъв и ако ще приемате всички файлови разширения, няма нужда от такава променлива.


<?php
//SECTION #2
$valid_ext = $upload_class->validate_extension();
$valid_size = $upload_class->validate_size();
$valid_user = $upload_class->validate_user();
$max_size = $upload_class->get_max_size();
$file_size = $upload_class->get_file_size();
$upload_directory = $upload_class->get_upload_directory();
$upload_log_directory = $upload_class->get_upload_log_directory();
$upload_file = $upload_class->upload_file_with_validation();
?>




Section #2
Втората секция извиква всички функции в class-а. Няма нужда да се извикват всички функции, но показваме, че бихте могли да го направите. Добра причина за извикване на всички функции е че бихте могли да заредите message return system. В този ред на мисли бихте могли да кажете if !$valid_ext и да върнете error message на юзера уведомяващо го, че файловото разширение е некоректно. Можете да извикате само $file_size и да върнете числото на юзера. Единствената функция, която Ви е необходима за upload files е последния ред стартиращ с $upload_file. Ако извиквате функцията с validation, използувайте последния ред горе, иначе без използувайте долния.

<?php
$upload_file = $upload_class->upload_file_with_no_validation();
?>


--------------------
*NOTE: Ако опитвате да validate against multiple uploads, задайте цикъл за всички uploads които имате и разположете целия извикващ class-а код, вътре в цикъла. Класа ще се изпълнява отново и отново докато трае цикъла с всеки файл .





Урока е изготвен от www.transcode.org


/ Трябва да сте регистриран за да напишете коментар /