ფაილების მისამართებთან მუშაობა PHP – თი საკმაოდ მარტივია, თუმცა ისეთ შემთხვევებში როდესაც ინტენსიურად არის საჭირო ფაილებთან დაკავშირებული ოპერაციების შესრულება ჩემთვის ძალიან დამღლელი და არასასიამოვნო პროცესია მუდმივად ერთი და იგივე ფუნქციების გამოყენება და განმეორებადი ოპერაციების შესრულება. გარდა ამისა ფაილების მისამართები განსხვავდება პლატფორმებს შორის (იგულისხმება windows და unix სისტემები). არსებული პრობლემები არცთუ ბევრია თუმცა მუდმივად მათი გათვალისწინება მოსაბეზრებელია, რაც თავისუფლად შესაძლებელია ავირიდოთ თავიდან ერთი უნიფიცირებული მეთოდის ჩამოყალიბებით.
პლატფორმებს შორის არსებული სხვაობები:
- ფაილების გამყოფი: ვინდოუსზე ფაილის გამყოფად გამოიყენება მარცხენა სლეში ანუ \ ხოლო უნიქს სისტემებში იგივე მიზნისთვის გამოიყენება მარჯვენა სლეში /
განსხვავება ფაილის სრულ მისამართში: ვინდოუსში ფაილის სრული მისამართს თავში ემატები პარტიშენის სახელი (მაგ. c:/ ), უნიქს სისტემებში სრული მისამართი აუცილებლად იწყება მარჯვენა სლეშით /
სხვა პრობლემატური ნიუანსები:
- არეული ფაილების გამყოფები: მაგალითად შემდეგი მისამართი გარკვეულ პრობლემებს იწვევს – c:\usr\local\www/appdir/datafolder/filename.php
- არასაჭირო(ზედმეტი) ფაილის გამყოფები: მაგ. /usr/local/www//appdir///datafolder/filename.php
- ზედმეტი წერტილები: მაგ. /usr/local/www//appdir///d..//../atafolder…..//filename.php
ყოველივე ამის გათვალისწინებით საჭიროა ერთი გარკვეული მეთოდის ჩამოყალიბება რომელიც შემდგომ გამოყენებული იქნება მთელს სისტემაში, რაც თავისთავად იქნება გარანტია იმისა რომ ნებისმიერ დროს ნებისმიერ შემთხვევაში ფაილების მისამართები დამუშავდება ერთნაირად და ასეთი მისამართი გამოსადეგი იქნება ნებისმიერ პლატფორმაზე.
რა პირობებს უნდა აკმაყოფილებდეს ასეთი კლასი?
- იგი არ უნდა იყოს დამოკიდებული ე.წ. DOCUMENT_ROOT – ზე რადგან იმ შემთხვევაში თუ ფაილებთან მუშაობა გვიწევს ftp ფუნქციების მეშვეობით ნაცვლად სტანდარტული ფუნქციებისა, სხვაობა DOCUMENT_ROOT – სა და ftp მისამართებს შორის აუცილებლად იარსებებს;
- უნდა აღმოფხვრას ე.წ. არეული ფაილების გამყოფების პრობლემა
- გადაცემული მისამართიდან უნდა ააგოს: აპლიკაციის საწყისი მისამართი (დირექტორია სადაც რეალურად არის დაინსტალირებული აპლიკაცია), ფაილის სრული მისამართი (DOCUMENT_ROOT – ის ჩათვლით), ე.წ. relative მისამართი, უნდა გამოყოს ფაილის სახელი მისამართიდან(ფაილის სახელში მოიაზრება როგორც ჩვეულებრივი ფაილი სახელი ასევე დირექტორიის სახელი)
ჩამოთვლილი მიზნების მისაღწევად სავსებით საკმარისია ქვემოთ ნაჩვენები პატარა კლასი:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | class FilePath { var $docRoot; //document root of the site var $appPath; //actual application path, document root + application installation folder var $relPath; //relative path of the requested file var $absPath; //absolute path of the file, $docRoot concatenated with $relPath var $fileName; //actual file/directory name function FilePath($path, $docRoot = null) { /** * if no $docRoot was passed used default DOCUMENT ROOT */ if (!$docRoot) { $docRoot = $_SERVER['DOCUMENT_ROOT']; } //cleanup document root $this->docRoot = $this->cleanup($docRoot); //cleanup application path $this->appPath = $this->cleanup(dirname(__FILE__)); //cleanup relative path $this->relPath = $this->cleanup(preg_replace('!^' . $this->appPath . '!', '', $path)); //build absolute path $this->absPath = $this->appPath . $this->relPath; //retrive file name from path $this->fileName = basename($this->relPath); } function cleanup($path) { $path = str_replace('', '/', $path); $path = preg_replace('!\.+/!', '', $path); $path = trim(trim($path), '\/'); $path = preg_replace('!/+!', '/', $path); if (!preg_match('!^\w:!', $path)) { $path = '/' . $path; } return $path; } function getDocRoot() { return $this->docRoot; } function getAppPath() { return $this->appPath; } function getRelativePath() { return $this->relPath; } function getAbsolutePath() { return $this->absPath; } function getFileName() { return $this->fileName; } function getParent() { return dirname($this->absPath); } } |
კლასს გააჩნია ორ პარამეტრიანი კონსტრუქტორი, სადაც პირველი პარამეტრი არის უშუალოდ იმ ფაილის/დირექტორიის მისამართი რომელთანაც ვაპირებთ მუშაობას, ხოლო მეორე არასავალდებულო პარამეტრი არის ე.წ. DOCUMENT_ROOT – ისთვის რომლის გამოყენებაც შესაძლებელია იმ შემთხვევაში თუ ვმუშოაბთ ftp რეჟიმში(რადგან ftp – ს შემთხვევაში DOCUMENT_ROOT განსხვავდება).
გასათვალისწინებელია ასევე ის მომენტი რომ რომელი ფაილიდანაც არ უნდა გამოვიყენოთ ეს კლასი ფაილის მისამართის მითითება შესაძლებელია პირდაპირ ინსტალაციის დირექტორიასთან მიმართებაში.
მაგალითად თუ აპლიკაცია დაინსტალირებულია /public_html/blog/ დირექტორიაში, ხოლო კონკრეტული სკრიფტში(რომელიც განთავსებულია მისამართზე /public_html/blog/dir/util/filemanager.php) რომლის მეშვეობითაც გვსურს გარკვეული მანიპულაციების ჩატარება /public_html/blog/data/uploads/images/img.gif ფაილზე, საკმარისია დავწეროთ შემდეგი კოდი:
$fp = &new FilePath('data/uploads/images/img.gif);
როგორც მაგალითში ჩანს FilePath კონსტრუქტორში გადაცემული მისამართი პირდაპირ იწნება data დირექტორიით, რაც ნიშნავს იმას რომ თვით აპლიკაციის ინსტალაციის დირექტორიის მითითება არ არის საჭირო რადგან FilePath გამოითვლის მას ავტომატურად. ასევე საგულისხმოა ის დეტალი რომ რამდენად ღრმაც არ უნდა იყოს აპლიკაციის ინსტალაციის დირექტორიების სიღრმე ეს გამოთვლა ყოველთვის სწორად განხორციელდება.
FilePath კლასის გამოყენების მარტივი ნიმუში:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $fp = &new FilePath('..//...../data/test...////....\////subdir//anot..../../.\hersubdir/'); echo '<b>Document Root:</b> ' . $fp->getDocRoot(); echo '<br /><br />'; echo '<b>Application Path:</b> ' . $fp->getAppPath(); echo '<br /><br />'; echo '<b>Relative Path:</b> ' . $fp->getRelativePath(); echo '<br /><br />'; echo '<b>Absolute Path:</b> ' . $fp->getAbsolutePath(); echo '<br /><br />'; echo '<b>Parent Directory:</b> ' . $fp->getParent(); echo '<br /><br />'; echo '<b>File Name:</b> ' . $fp->getFileName(); |
კოდის შესრულების შედეგი გამოიყურება შემდეგნაირად:
Document Root: c:/program files/easyphp1-8/www Application Path: c:/program files/easyphp1-8/www/test/io Relative Path: /data/test/subdir/anothersubdir Absolute Path: c:/program files/easyphp1-8/www/test/io/data/test/subdir/anothersubdir Parent Directory: c:/program files/easyphp1-8/www/test/io/data/test/subdir File Name: anothersubdir
შედეგიდან ჩანს რომ მიუხედავად იმისა რომ პარამეტრად გამოვიყენეთ ერთი შეხედვით ყოვლად არაფრისმთქმელი არეული მისამართი, კლასმა შეძლო მისი შესაბამისად გაფილტვრა და ასევე მისამართების სწორად აგება.
გამოყენების სხვა ნიმუშები:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $fp = &new FilePath('data/images/file.jpg'); if (is_dir($fp->getAbsolutePath())) { echo 'is directory'; } if (is_file($fp->getAbsolutePath())) { echo 'is file'; } if (file_exists($fp->getAbsolutePath())) { echo 'file exists'; } |
როგორც მაგალითებიდან ჩანს აღწერილი კლასის გამოყენება ძალიან მარტივია, და რაც ყველაზე მთავარია ერთნაირი წარმატებით იმუშავებს ნებისმიერ პლატფორმაზე.
ტეგები: PHP