php fayllarının çoxsaylı yüklənməsi. PHP-də serverə faylların yüklənməsi (yükləmə) nümunəsi

Çoxhissəli formalar

  • Məktuba əlavə (qoşma) əlavə etməyə imkan verən poçt xidmətlərinin veb interfeysləri və bunun üçün əvvəlcə faylı serverə yükləməlisiniz və yalnız bundan sonra onu məktuba əlavə etmək olar;
  • Faylların serverə yüklənməsi mexanizmi olmadan mövcud ola bilməyən interaktiv foto qalereyalar və foto albomlar;
  • Müxtəlif proqramların fayllarının mübadiləsi üçün istifadə olunan pulsuz proqram portalları və s.

Faylın serverə yüklənməsi fayl yükləmə sahəsinə malik olan çoxhissəli formadan istifadə etməklə həyata keçirilir. Enctype parametri multipart/form-data olaraq təyin edilmişdir:



Verilmiş çoxhissəli forma belə görünəcək (siz serverə kiçik bir fayl yükləyərək çoxhissəli formaların nəticəsini görmək üçün ondan istifadə etməyə cəhd edə bilərsiniz):

Çoxhissəli formalar adətən POST təqdimetmə metodundan istifadə edir. Əvvəlki nümunədən göründüyü kimi, bu formada iki sahə var:

  • Yükləmək üçün fayl seçimi sahəsi;
  • Serverdə olacaq fayl adını təyin etmək üçün sahə.

Çoxhissəli formaların işlənməsi

Çoxhissəli forma emal skriptini yazmağa başlamazdan əvvəl faylların serverə yüklənməsinə icazə vermək üçün php.ini konfiqurasiya faylını redaktə etməlisiniz.

PHP konfiqurasiya faylı php.ini faylların serverə yüklənməsi ilə bağlı üç parametrə malikdir:

  • file_uploads=Aktiv - faylların HTTP vasitəsilə serverə yüklənməsinə icazə verir;
  • upload_tmp_dir=/tmp - yüklənmiş faylların müvəqqəti saxlanması üçün kataloq təyin edir;
  • upload_max_filesize=2M - yüklənmiş faylların maksimum ölçüsünü təyin edir.

Əgər veb serveriniz Linux əməliyyat sistemi ilə işləyirsə, onda siz xidməti yenidən başlatmalısınız:

xidmət httpd yenidən başladın

PHP çoxhissəli formaları necə idarə edir? Faylı qəbul etdikdən sonra onu təsadüfi seçilmiş fayl adı ilə upload_tmp_dir adlı müvəqqəti qovluqda saxlayır. Sonra o, dörd superqlobal massiv dəyişənini yaradır $_FILES . Bu massiv yüklənmiş fayl haqqında məlumat ehtiva edir.

Yüklənmiş fayllar üçün müəyyən edilmiş dəyişənlər PHP versiyasından və cari konfiqurasiyadan asılıdır. $_FILES superqlobal massivi PHP 4.1.0-dan bəri mövcuddur. register_globals konfiqurasiya direktivi təyin edildikdə haqqında, əlavə olaraq uyğun adları olan dəyişənlər elan ediləcək. 4.2.0 versiyasından etibarən register_globals seçimi üçün standart dəyərdir off.

Nümunəmiz üçün $_FILES massivinin məzmunu aşağıda göstərilmişdir. Qeyd edək ki, bu, yuxarıdakı çoxhissəli formaya uyğun olaraq, yükləmə faylının adının fayl seçimi sahəsi üçün istifadə edildiyini nəzərdə tutur. Təbii ki, sahə adı hər hansı bir şey ola bilər.

  • $_FILES["uploadfile"]["name"] - serverə göndərilməzdən əvvəl faylın adı, məsələn, pict.gif;
  • $_FILES["uploadfile"]["size"] - qəbul edilmiş faylın baytla ölçüsü;
  • $_FILES["uploadfile"]["type"] - qəbul edilmiş faylın MIME növü (brauzer onu aşkar edə bilsəydi), məsələn: image/gif, image/png, image/jpeg, text/html;
  • (fayl yükləmə sahəsini belə adlandırdıq) - müvəqqəti kataloqda faylın adını ehtiva edir, məsələn: /tmp/phpV3b3qY;
  • $_FILES["uploadfile"]["error"] - Fayl yüklənərkən baş verə biləcək xəta kodu. Açar ["xəta"] PHP 4.2.0-da əlavə edilmişdir. Müvafiq səhv kodlarını görə bilərsiniz

Skript tamamlandıqdan sonra müvəqqəti fayl silinəcək. Bu o deməkdir ki, skript tamamlanmazdan əvvəl onu başqa yerə köçürməliyik. Yəni serverə fayl yükləmək üçün skriptin alqoritmi aşağıdakı kimidir:

Əgər "Göndər" düyməsi sıxılırsa, fayl artıq serverə yüklənəcək və onun adı $_FILES["uploadfile"]["name"] dəyişənində olacaq. Bu halda skript dərhal $_FILES["uploadfile"]["tmp_name"] adlı faylı hansısa qovluğa köçürməlidir (bu qovluğa yazma hüquqları tələb olunur).

Fayl copy() funksiyasından istifadə edərək kopyalanır:

köçürmə funksiyasından deyil, yalnız copy() surəti funksiyasından istifadə edin, çünki:

  • Müvəqqəti fayl avtomatik olaraq silinəcək;
  • Müvəqqəti kataloq başqa mediadadırsa, səhv mesajı göstərilir.

Tutaq ki, veb serverin kök kataloqunda (DocumentRoot qovluğunda) yerləşən yükləmələr qovluğuna fayl yükləmək lazımdır.

// Hər ehtimala qarşı bir kataloq yaradaq. Əgər o, artıq yaradılmışdırsa,
// xəta mesajını görməyəcəyik, çünki @ operatorundan istifadə edəcəyik:

@mkdir("yükləmələr", 0777);

// /tmp-dən faylı yükləmələrə kopyalayın
// Fayl adı serverə göndərilməzdən əvvəl olduğu kimi olacaq:

Kopyala($_FILES["yükləmə faylı"]["tmp_adı"],"yükləmələr/".basename($_FILES["yükləmə faylı"]["ad"]));

Linux-da hər şey daha mürəkkəbdir - yükləmələr kataloqunun icazələrini nəzərə almalıyıq. Çox güman ki, bu halda mkdir() funksiyası işləməyəcək, çünki bizim DocumentRoot kataloquna (adətən /var/www/html və ya /home/httpd/html) yazmaq icazəmiz yoxdur. Kök kimi daxil olun, yükləmələr kataloqu yaradın və onun sahibini və icazələrini aşağıdakı kimi dəyişdirin:

// Yükləmələr qovluğunu yaradın

// Apache sahibinin adını və onun qrupunu təyin edin - həmçinin apache:

Chown apache:apache yükləmələri

// Hər kəsə yazmağa icazə verin (777) + yapışqan biti təyin edin (1):

Chmod 1777 yükləmələr

İstənilən halda faylın ölçüsü məhdudlaşdırıla bilər, siz .htaccess faylını redaktə edə və yükləmələr qovluğuna girişi məhdudlaşdıra bilərsiniz - ya qovluğa daxil ola biləcək xüsusi istifadəçiləri, ya da IP ünvanlarını təyin edin;

İndi faylları serverə yükləyə bilərsiniz.

Faylları serverə yükləmək üçün PHP skriptinin yazılması

Birdən çox faylın yüklənməsi, məsələn, giriş etiketi üçün müxtəlif ad dəyərlərindən istifadə etməklə həyata keçirilə bilər.

Eyni zamanda yüklənmiş bir neçə fayl haqqında massivdə təşkil edilmiş məlumatı avtomatik əldə etmək də mümkündür. Bu funksiyanı həyata keçirmək üçün bir neçə seçim və qeyd qutusu sahələri üçün olduğu kimi HTML formasından massiv təqdim etmək üçün eyni sintaksisdən istifadə edin:


Bu faylları göndərin:






Əgər belə forma təqdim olunubsa, $_FILES["userfile"] , $_FILES["userfile"]["name"] və $_FILES["userfile"]["size"] massivləri işə salınacaq (eyni formatda) PHP 4.1.0 və əvvəlki versiyalar üçün $HTTP_POST_FILES kimi). register_globals konfiqurasiya direktivi on olaraq təyin edilərsə, onu müşayiət edən qlobal dəyişənlər də işə salınacaq. Bu dəyişənlərin hər biri qəbul edilmiş fayllar üçün müvafiq dəyərlərin ədədi olaraq indeksləşdirilmiş massivi olacaqdır.

Fərz edək ki, /home/test/some.html və /home/test/file.bin faylları yüklənib. Bu halda, $_FILES["userfile"]["name"] dəyişəni some.html dəyərinə, $_FILES["userfile"]["name"] dəyişəni isə file.bin dəyərinə malik olacaq. Eynilə, $_FILES["userfile"]["size"] dəyişəni some.html faylının ölçüsünü və s. ehtiva edəcək.

Dəyişənlər $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] və $_FILES["userfile"]["type "] də işə salınacaq.

Nəticə:

Gördüyünüz kimi, faylların serverə yüklənməsini təşkil etmək o qədər də çətin deyil. Tələb olunan təhlükəsizlik səviyyəsini təmin etmək daha çətindir, çünki faylları serverə yükləmək təcavüzkarlar tərəfindən serverə hücum etmək üçün istifadə edilə bilər. Yükləmələrlə işləyərkən tələb olunan təhlükəsizlik səviyyəsini necə təmin etmək barədə məlumat üçün baxın.



>
Başqa sualınız varsa və ya aydın olmayan bir şey varsa - bizim səhifəmizə xoş gəlmisiniz

Bu yazıda faylları serverə yükləməyin maraqlı yolunu vurğulamaq istəyirəm. Skript tam işlək olacaq və bir qədər uyğunlaşdıqdan sonra, əlbəttə ki, maraqlanırsınızsa, layihələrinizdə istifadə edə bilərsiniz.

Bəli, bu metodu "Serverə faylların yüklənməsi AJAX" adlandırmaq olar, baxmayaraq ki, nə ActiveXObject, nə də XMLHttpRequest istifadə etmir, lakin sonradan bu AJAX-a çevrildi. Ümumiyyətlə, burada yeni başlayanlar üçün olduqca yaxşı bir tapıntı olacaq bir neçə inkişaf hiyləsini ortaya qoyacağam.

Birincisi, metod dinamik olaraq əlavə edilmiş/çıxarılmış fayl yükləmə sahələrindən istifadə edir (JavaScript siyahısı əlavə olunur) - yəni. Bu qeyd serverdə qeyri-müəyyən sayda faylların yüklənməsi və işlənməsindən bəhs edir və həmişə olduğu kimi, mümkün qədər yığcam və aydın yazmağa çalışıram.

İkincisi, əlbəttə ki, səhifəni yenidən yükləmədən hər şey baş verəcəkdir.

Üçüncüsü, məlumatları qəbul edən, məlumatları göstərən və fayl yükləmə xətalarını idarə edən bir server skripti veriləcəkdir.

Dördüncüsü, faylların yüklənməsinin sonunda istifadəçiyə hansı faylların yükləndiyi, hansının yüklənmədiyi və nə üçün olduğu barədə məlumat göstəriləcək. Ümumiyyətlə, bir geliştiricinin arsenalında qiymətli bir şey.

Artıq bildiyimiz kimi, html formalarını yazarkən, forma elementlərinin “ad” atributları sonradan qlobal massivlərin açarları olur: $_REQUEST $_GET və ya $_POST və əgər formada eyni “ad” atributuna malik iki sahə varsa. , onda sonuncu sahənin dəyəri qlobal massivdəki əvvəlkilərin "üzerinə yazılacaq" dəyərlər olacaq. Bunlar. əgər bizdə aşağıdakılar varsa:

Sonra emal skriptində biz $_FILES massivini görəcəyik, onun yalnız bir açarı “upfile” olacaq və id="bir" olan birinci sahənin dəyəri üzərinə yazılacaq.

Bu problemin həlli çox sadədir: biz “ad” və “id” atributlarına müxtəlif adlar veririk. Amma! Bəs faylları yükləmək üçün sahələr dinamik şəkildə əlavə edilməlidirsə və onların sayı əvvəlcədən məlum deyilsə? Bir qayda olaraq, proqramçılar "ad" atributuna müəyyən rəqəmli şəkilçi əlavə edərək, belə şeyləri bir döngədə yaratmağa üstünlük verirlər və bununla da "ad" atributunun unikallığını təmin edirlər və id atributu, nadir istisnalarla, demək olar ki, həmişə ola bilər. buraxılmış (Elementlərə daxil olmaq üçün DOM üsullarını yadda saxla) Formanı yaradan server skripti belə görünə bilər:



Əlaqədar nəşrlər