Php yuklash fayli. PHP yordamida serverga fayllarni yuklash. Faylni serverga yuklash bosqichlari

PHP yordamida serverga faylni qanday yuklash mumkin? Ushbu maqolada biz ushbu masalani misollar bilan batafsil ko'rib chiqamiz.

Fayl yuborish uchun HTML formasi

Fayllarni serverga yuklash uchun bilishingiz kerak bo'lgan birinchi narsa bu faylni yuboradigan HTML shakllarining xususiyatlari.

Bu shakl uchun HTML kodiga misol:

Fayl yuklash shakli



Ushbu shaklning o'ziga xosligi nimada:

  1. Shakl tegida enctype="multipart/form-data atributi bo'lishi kerak. Bu atribut shakl faylni yuborishini bildiradi. Odatiy bo'lib, enctype atributi application/x-www-form-urlencoded ga o'rnatiladi.
  2. Shakl MAX_FILE_SIZE nomiga ega yashirin atributni (type="yashirin") o'z ichiga olishi kerak, uning qiymati (qiymati) fayl hajmini bildiradi. Nazariy jihatdan, brauzerlar faylning oshib ketishi haqida xabar berishlari kerak ruxsat etilgan o'lchamlar, lekin amalda brauzerlar buni qo'llab-quvvatlamaydi. Menimcha, bu xususiyatni o'tkazib yuborish mumkin.
  3. O'tkaziladigan faylni tanlash uchun type="file" atributiga ega bo'lgan kiritish tegidan foydalaning.

Server bunday shakldan HTTP so'rovini olgandan so'ng, u faylni serverdagi vaqtinchalik papkaga yozadi.

Agar siz ushbu bosqichda faylni boshqa katalogga saqlashni istasangiz, uni php.ini faylining upload_tmp_dir direktivasida belgilang.

Yuklangan faylni yangi joyga ko'chirish uchun move_uploaded_file funksiyasidan foydalaning.

Ammo biz ushbu funktsiya bilan ishlashni boshlashdan oldin, biz yuklangan faylning xususiyatlariga kirishimiz mumkin bo'lgan ikki o'lchovli $_FILES massivini tekshirishimiz kerak.

Shunday qilib, skript uzatilgan fayl bilan shakl ma'lumotlarini olgandan so'ng, u faylni maxsus papkaga yozdi va fayl haqidagi ma'lumotlarni ikki o'lchovli massivga yozdi $_FILES .

Ekranda $_FILES massivining mazmunini aks ettiruvchi misolni ko'rib chiqamiz.

Fayl yuklash shakli


"; ) boshqacha ( echo "
", print_r($_FILES), "
"; } ?>

Ushbu skript natijasida biz nimaga erishamiz:

1-rasm. $_FILES massivi.

Keling, ushbu massivda nima borligini ko'rib chiqaylik.

Ikki o'lchovli $_FILES massivimizda bitta element mavjud, fayl nomi. Bu forma elementidagi nom maydonining qiymati:

Ushbu fayl uchun ma'lumotlar:

  • $_FILES["filename"]["name"] - fayl nomi;
  • $_FILES["filename"]["type"] - fayl turi;
  • $_FILES["filename"]["tmp_name"] - diskdagi vaqtinchalik katalogga to'liq yo'l;
  • $_FILES["filename"]["error"] - xato kodini o'z ichiga oladi, agar operatsiya muvaffaqiyatli bo'lsa, 0 ga teng;
  • $_FILES["filename"]["size"] - fayl hajmi.

Shaklda fayllar uchun ikkita maydonni belgilash mumkin, masalan:


Bunday holda, bizning massivimiz quyidagicha ko'rinadi:


2-rasm. $_FILES massivi.

Shunday qilib, endi biz $_FILES massivi qanday tuzilganligini bilamiz va keyingi qadam natijada olingan faylni kerakli joyga qo'yishdir.

move_uploaded_file funktsiyasi

Men allaqachon yozganimdek, move_uploaded_file funktsiyasi yuklangan faylni yangi joyga ko'chirish uchun ishlatiladi.

move_uploaded_file funksiyasining sintaksisi:

move_uploaded_file (qaerdan o'tkazish kerak, qayerdan o'tkazish kerak)

move_uploaded_file funksiyasi mantiqiy qiymatni qaytaradi:

  • TRUE - agar muvaffaqiyatli bo'lsa,
  • FALSE - agar birinchi argument yuklangan fayl bo'lsa, lekin biron sababga ko'ra ko'rsatilgan joyga ko'chirilmasa, bu holda hech qanday chora ko'rilmaydi.

Keling, ushbu funktsiyani misolda ishlatamiz:

Fayl yuklash shakli


"; ) else ( move_uploaded_file ($_FILES["filename"]["tmp_name"], __DIR__ . DIRECTORY_SEPARATOR . $_FILES["filename"]["name"]); ) ?>

Ushbu skript tasvirni o'zi joylashgan papkaga ko'chiradi. Buning uchun biz yo'lni belgilash uchun PHP ning o'rnatilgan konstantalaridan foydalanamiz:

  • __DIR__ "sehrli" konstantalardan biri bo'lib, unda fayl katalogi mavjud;
  • DIRECTORY_SEPARATOR - yo'l ajratuvchini o'z ichiga olgan oldindan belgilangan doimiy. Windows OS uchun "\", Linux OS va boshqalar uchun "/".

Eslatma: Olingan fayl allaqachon mavjud bo'lsa, uning ustiga yoziladi.

is_uploaded_file funksiyasi

Fayllarni serverga yuklash bilan ishlashda foydalanish kerak bo'lgan yana bir funktsiya mavjud. Bu is_uploaded_file funksiyasi va xavfsizlik sabablaridan foydalaniladi.

is_uploaded_file - fayl HTTP POST yordamida yuklanganligini aniqlaydi va agar shunday bo'lsa, TRUE qiymatini qaytaradi.

Ushbu funktsiyadan foydalanish zararli foydalanuvchi skriptni aldab qo'ymaslik kerak bo'lgan fayllar bilan ishlashga urinmasligini ta'minlash uchun foydalidir - masalan /etc/passwd.

Esda tuting: is_uploaded_file funksiyasi to‘g‘ri ishlashi uchun serverdagi vaqtinchalik xotiradagi faylga yo‘lni, ya’ni $_FILES["filename"]["tmp_name"] kabi argumentni, lekin nomini o‘tkazishingiz kerak. mijoz mashinasida yuklangan fayl ($_FILES[" filename"]["name"]) bu erda qo'llanilmaydi.

Fayl yuborish formasini boshqaradigan so'nggi misol skriptimiz quyidagicha ko'rinadi:

Fayl yuklash shakli


"; ) else ( // Fayl yuklanganligini tekshiring if(is_uploaded_file($_FILES["filename"]["tmp_name"])) ( // Agar fayl muvaffaqiyatli yuklangan boʻlsa, uni // vaqtinchalik katalogdan koʻchiring. oxirgi bir move_uploaded_file ($_FILES ["filename"]["tmp_name"], __DIR__ . DIRECTORY_SEPARATOR . $_FILES["filename"]["name"] else ( echo("Faylni yuklashda xato"); ) ) ? >

Fayl hajmini cheklash

Ba'zi hollarda siz serverga yuklanishi mumkin bo'lgan fayl hajmini cheklashingiz kerak. Masalan, serverga faqat hajmi 3 MB dan oshmaydigan fayllarni yuklashga ruxsat berish uchun yuqoridagi skriptda quyidagi kod mavjud:

1024*3*1024) ( echo("Fayl hajmi uch megabaytdan oshadi"); chiqish; ) ... ?>

Yuklash faylining maksimal hajmi php.ini faylidagi upload_max_filesize direktivasi yordamida ham o'rnatilishi mumkin. Ushbu direktivaning standart qiymati 2 MB:

$upload_max_filesize) ... ?>

Fayllarni serverga yuklash uchun PHP.ini sozlamalari

Shunday qilib, biz yuklangan faylning maksimal hajmini belgilaydigan php.ini faylining upload_max_filesize direktivasi haqida bilib oldik. php.ini faylidagi yana qanday direktivalar fayllarni serverga yuklash uchun javobgardir?

Aytgancha, agar siz php.ini faylingiz qayerda joylashganligini bilmoqchi bo'lsangiz, skriptni ishga tushiring:

Shunday qilib, php.ini faylidagi direktivalar ro'yxati:

  • file_uploads - fayllarni umuman serverga yuklashni taqiqlash yoki ruxsat berish qobiliyati, sukut bo'yicha yoqilgan (qiymat Yoqilgan).
  • post_max_size - POST so'rovida uzatiladigan ma'lumotlar hajmining umumiy yuqori chegarasi. Agar siz bir vaqtning o'zida bir nechta fayllarni uzatishingiz yoki katta fayllar bilan ishlashingiz kerak bo'lsa, ushbu direktivaning qiymatini o'zgartiring. Standart qiymat 8 MB.
  • upload_max_filesize - bu biz allaqachon muhokama qilgan ko'rsatma. Agar kerak bo'lsa, post_max_size ni ham o'zgartirishni unutmang.
  • upload_tmp_dir - barcha yuklangan fayllar joylashtiriladigan serverdagi vaqtinchalik katalog.

Men sizga "PHP serveriga fayllarni yuklash" mavzusida aytmoqchi bo'lgan narsam shu.

Deyarli har bir loyihada ishlab chiquvchi serverga fayllarni yuklash zarurati bilan duch keladi. Rasmlar, rasmlar, hujjatlar, arxivlar va boshqa ko'p narsalarni veb-interfeys (brauzer orqali) orqali serverga yuklash mumkin.


Http://localhost/index.php?name=myname&page=10

index.php sahifasiga GET so'rovini belgilaydi. Bunday holda, skriptga "name" va "sahifa" parametrlari mos ravishda "myname" va "10" qiymatlari bilan uzatiladi. Ko'rib turganingizdek, so'rov "&" bilan birlashtirilgan "name=value" juftlaridan iborat. So‘rov sahifa manzilidan “?” savol belgisi bilan ajratiladi.

Ammo GET katta ma'lumotlarni uzatish uchun mos emas. Buning uchun POST usuli mavjud. Ushbu usul foydalanuvchidan yashirin ma'lumotlarni uzatadi va sahifa manzili o'zgarishsiz qoladi. Nazariy jihatdan, POST usuli sizga ma'lumotlarning katta bloklarini uzatish imkonini beradi, lekin ko'pchilik provayderlar 5-10 megabaytlik qattiq chegarani o'rnatadilar.

Faylni yuklab olishni amalga oshirish uchun foydalanuvchiga tegishli shaklni taqdim etish kerak. Fayl kiritish tegi fayllarni yuklash uchun ishlatiladi.

Yuklab olish uchun faylni tanlang:

Foydalanuvchi tanlaydi kerakli fayl, "Yuborish!" tugmasini bosing, shundan so'ng brauzer belgilangan faylni serverga o'tkazadi. Fayl yuklab olingandan so'ng, receiver.php ishga tushiriladi va shaklda taqdim etilgan barcha ma'lumotlar unga avtomatik ravishda mavjud bo'ladi.

Yuklab olingan fayllar roʻyxati global $_FILES massivida saqlanadi. Bu assotsiativ massiv, bu erda har bir element fayllardan birining tavsifini o'z ichiga oladi. Keling, bir misolni ko'rib chiqaylik:

3145728) ( $filesize = ($filesize != 0)? sprintf("(%.2f MB)" , $filesize / 1024): ""; die("Xato: biriktirilgan fayl hajmi ". $filesize. " juda katta (3 MB)." ) else ( $filename = $_FILES["file"]["name"]; $filepath = $_FILES["file"]["tmp_name"]; $filetype = $_FILES[" file"]["type"]; if($this->filetype == null || $this->filetype == "") $this->filetype = "noma'lum/noma'lum" ) ); echo "Muvaffaqiyatli fayl yuklandi: ". $filename; ?>

Barcha yuklab olingan fayllar server tomonidan vaqtinchalik katalogda saqlanadi va skript tugagandan so'ng avtomatik ravishda o'chiriladi. Agar siz faylni serverda saqlashingiz kerak bo'lsa, uni sayt kataloglaridan biriga ko'chirishingiz kerak. Buning uchun maxsus funktsiya mavjud. move_uploaded_file(). Odatda funksiya bilan birgalikda ishlatiladi is_uploaded_file(), bu fayl forma orqali yuklanganligini aniqlash imkonini beradi. Masalan:

Har bir yuklab olingan fayl haqidagi ma'lumotlar skriptda $_FILES massivining elementlari sifatida ko'rsatilgan. Element nomi forma tegining nom atributi bilan aniqlanadi. Bizning holatlarimizda name atributi "ufile" ga teng, ya'ni bu fayl haqidagi ma'lumotlar $_FILES["ufile"] elementida saqlanadi.

Har bir $_FILES elementi, shuningdek, belgilangan nomlarga ega besh elementni o'z ichiga olgan massivdir:

Yuklab olingan fayllar hajmi provayderdan provayderga sezilarli darajada farq qilishi mumkin. Ba'zi ma'murlar fayllarni yuklashni butunlay taqiqlaydi. Bunday holda, faylni hali ham yuklab olish mumkin, server uni o'chirib tashlaydi va skriptga fayl borligi, lekin allaqachon o'chirilganligi haqida xabar beradi.

Bizning maqolamizda fayllarni serverga yuklash uchun PHP skriptini yaratish misolini ko'rib chiqamiz. Bizning oddiy fayl yuklash misolimizda 2 ta fayl bo'ladi: forma (form.html), PHP faylni yuklash skripti (uploader.php).

Endi hamma narsani batafsil ko'rib chiqaylik. Birinchidan, form.html forma faylini tahlil qilamiz:


Ko'rib turganingizdek, bu oddiy html kodi, bu erda hech qanday murakkab narsa yo'q, yagona narsa shundaki, agar forma fayllarni serverga yuklasa, u holda atribut ko'rsatilishi kerak. enctype="ko'p qismli/shakl-ma'lumotlar".

Bizning shaklimiz quyidagicha ko'rinadi:

MisolPHP fayl yuklash uchun skript

Endi serverga fayllarni yuklaydigan php faylni ko'rib chiqamiz. Quyida uning manba kodi:

// Fayl qaerga joylashtiriladi $target_path = 'uploaded_files/"; /* Asl fayl nomini maqsadli yo'lga qo'shing. Natija "uploaded_files/filename.extension" */ $target_path = $target_path . basename($_FILES) ["file"]["name"]); if(move_uploaded_file($_FILES["file"]["tmp_name"], $target_path)) ( echo "The file ". basename($_FILES["file"][" "name"]) " yuklandi" ) else( echo "Faylni yuklashda xatolik yuz berdi, qaytadan urinib ko'ring!"; )

PHP fayl yuklash skripti qanday ishlaydi?

uploader.php hisoblanadi oddiy php fayllarni serverga yuklash uchun skript, bu bizning fayllarimizni saytdagi ma'lum bir katalogga yuklaydi, bu $target_path = "uploaded_files/" qatori bilan ko'rsatilgan;

Albatta, faylimiz yuklangan yoki yuklanmaganligi aniq bo'lishi uchun biz if/else yordamida xabarlarning asosiy chiqishini qilamiz.

Faylni yuklab olishda xakerlardan himoya

Biz nafaqat xakerlik nuqtai nazaridan himoya qilishni, balki fayllarni serverga yuklashda yuzaga keladigan boshqa kiruvchi muammolarni ham ko'rib chiqamiz.

PHP fayl o'rami

Bu serverga fayllarni yuklash bilan bog'liq birinchi muammo. Yuklab olingan faylda PHP o'rami bo'lsa, bu uning kengaytmasi php bo'ladi degani emas. U image.jpg (.gif, .png…) kabi koʻrinishi mumkin. Ammo ichkarida u quyidagicha ko'rinadi:

Ba'zi ustalar urlni kezish orqali serverdagi buyruqlarni ham bajarishlari mumkin:

$ curl http://server/uploads/shell.php?command=any_unix_command

Himoya usuli:

Himoya qilish uchun siz MIME fayllarini tekshirishni amalga oshirishingiz mumkin. Quyidagi misolga qarang:

If($_FILES["file"]["type"] != "image/gif") ( echo "Kechirasiz, biz faqat GIF rasmlarni yuklashga ruxsat beramiz"; chiqish; )

Bu parcha php kodi yuklanishi mumkinligini tekshiradi GIF fayli fayl. Ushbu kodni PHP faylni yuklash skriptidan oldin joylashtiring. Tabiiyki, chekni jpg, png yoki boshqa kerakli fayllarga o'zgartirishingiz mumkin.

Haqiqatan ham, agar siz sarlavha sarlavhasini MIME ko'rsatmalari bilan yuborsangiz, ushbu himoya usulini chetlab o'tish mumkin. Buning uchun mavjudligini tekshirish kerakyuklab olingan fayldagi teglar.

Yuklash fayl hajmi chegarasi

Katta hajmdagi fayllar diskdagi joyni egallashi bilan bog'liq muammolar ham bo'lishi mumkin. Buning uchun siz yuklangan fayl hajmiga cheklov yozishingiz kerak.

Buni forma yordamida amalga oshirishingiz mumkin, buning uchun formaning html kontekstiga quyidagi qatorni qo'shishingiz kerak;

Ushbu yashirin kiritish maydoni yuklangan fayl hajmini cheklaydi. Yoki PHP yordamida fayl hajmini tekshirishingiz mumkin.

Haqida yozingfayllarni yuklash uchun php skripti uzoq vaqt talab qilishi mumkin, lekin biz allaqachon serverga fayllarni yuklashning asosiy tamoyilini muhokama qildik. Shuning uchun agar kimdir boshqa savollarga ega bo'lsa, ularni sharhlarda so'rang.


Onlayn fotoalbomdagi fotosuratlar nimaga biriktirilgan bo'lishi mumkin elektron pochta yoki onlayn ommaviy ishlov berish dasturiga yuborilgan fayllar? Ularning barchasi veb-brauzerdan Internet orqali serverga yuklanishi kerak. Darhaqiqat, fayllarni yuklash biz har kuni foydalanadigan ko'plab saytlar va veb-ilovalarning muhim xususiyatidir. Ushbu maqolada siz PHP yordamida veb-saytingizga fayl yuklash yordamini qanday qo'shishni o'rganasiz.

Fayllarni yuklashdan oldin talablar

Yuklab olingan fayllarni qayta ishlash standart jarayondir, lekin siz boshlashdan oldin bir nechta kichik narsalarga e'tibor berishingiz kerak. Ishonch hosil qilishingiz kerak bo'lgan birinchi narsa - PHP sozlangan va fayllarni yuklash imkonini beradi. Buning uchun php.ini-da file_uploads direktivasini tekshirishingiz kerak va agar u o'chirilgan bo'lsa, uni yoqing.

File_uploads = Yoqilgan

Yuklangan fayllar avval vaqtinchalik katalogda saqlanadi (lekin xavotirlanmang... PHP skriptingiz keyinchalik fayllarni mosroq joyga koʻchirishi mumkin). Manba joylashuvi tizim uchun standart vaqtinchalik katalog hisoblanadi. php.ini da upload_tmp_dir direktivasi yordamida boshqa katalogni belgilashingiz mumkin. Qanday bo'lmasin, PHP jarayoni foydalanilayotgan katalogga qarab to'g'ri yozish ruxsatlariga ega ekanligini tekshirish yaxshi fikr.

Upload_tmp_dir = "/tmp" tboronczyk@zarkov:~$ ls -l / | grep tmp drwxrwxrwt 13 root root 40960 2011-08-31 00:50 tmp

Konfiguratsiya serverga yuklangan fayllarni qabul qilish imkonini berishiga ishonchingiz komil bo'lsa, siz tafsilotlarga e'tibor qaratishingiz va HTML formasini qo'shishingiz mumkin. Sizning elementingiz juda muhimdir

POST usulidan foydalangan va enctype atributi multipart/form-data ga o'rnatilgan.

Faylni serverga yuklash bosqichlari

Ehtimol, siz o'zingizning tajribangiz va yuqorida aytib o'tgan talablar asosida fayllar serverga qanday yuklanishini allaqachon tasavvur qilishingiz mumkin.

  • Tashrifchi faylni yuklashni qo'llab-quvvatlash uchun maxsus yozilgan shaklga ega HTML sahifani ko'radi;
  • Keyinchalik, u yuklab olmoqchi bo'lgan faylni taqdim etadi va yuborish tugmasini bosadi;
  • Brauzer faylni kodlaydi va uni POST so'rovining bir qismi sifatida yuboradi;
  • PHP yuborish shaklini oladi, faylni dekodlaydi va uni serverdagi vaqtinchalik joyda saqlaydi;
  • Shakl xabarini qayta ishlash uchun mas'ul bo'lgan yozma PHP skripti faylni tekshiradi va uni qandaydir tarzda qayta ishlaydi, ko'pincha uni vaqtinchalik joydan fayl saqlanadigan doimiy joyga ko'chiradi.

Fayl yuklash qo'llab-quvvatlashini qo'shish uchun siz foydalanuvchiga taqdim etiladigan HTML formasini va serverda yuklangan faylga g'amxo'rlik qiladigan PHP skriptini yaratishingiz kerak.

Faylni yuklash uchun HTML formasini qo'shish

HTML shakllari foydalanuvchi faylni yuklashni boshlaydigan interfeysni ta'minlaydi. Element ekanligini unutmaslik kerak nashr qilish uchun metod atributi va enctype atributi multipart/form-data ga oʻrnatilgan boʻlishi kerak. Element fayl yuklanadigan faylni belgilash uchun ishlatiladigan maydonni taqdim etadi. Boshqa har qanday shakl elementi singari, unga murojaat qilishingiz uchun nom atributini taqdim etish muhimdir PHP skripti e, shaklni qayta ishlash.

Fayl yuklash shaklining odatiy tartibi quyidagicha ko'rinadi:


Shuni ta'kidlash joizki turli brauzerlar faylni yuklash maydonini boshqacha ko'rsatadi. IE, Firefox va Opera uni yonidagi "Browse" yoki "Tanlash" tugmasi bo'lgan matn maydoni sifatida ko'rsatadi. Safari uni xuddi "Faylni tanlash" tugmasi kabi ko'rsatadi. Umuman olganda, bu muammo emas, chunki foydalanuvchilar o'z brauzerida maydonni ko'rsatish usuliga o'rganib qolgan va undan qanday foydalanishni bilishgan. Biroq, ba'zida siz uni qandaydir tarzda taqdim etishda qat'iy bo'lgan mijoz yoki dizaynerni uchratasiz. Fayl maydoniga qo'llanilishi mumkin bo'lgan CSS va JavaScript miqdori brauzerlar tomonidan o'rnatilgan xavfsizlik nuqtai nazaridan juda cheklangan. Faylni yozish qiyin bo'lishi mumkin. Agar ko'rinish siz uchun juda muhim, men sizga maqolalardan birini o'qishni tavsiya qilaman "Piter-Pol Koch" kiritish turi = "fayl".

Serverga o'ting va PHP bilan ishlang

Fayl yuklab olish ma'lumotlari yordamida taqdim etiladi ko'p o'lchovli massiv$_FILES. Bu massiv o'zining tuzilishiga ega, HTML formasidagi fayl maydonlari uchun tayinlangan nomlarga ega, xuddi $_GET va $_POST bilan ishlashda bo'lgani kabi. Keyin har bir fayl massivi quyidagi elementlarni o'z ichiga oladi:

  • $_FILES["myFile"]["name"] - faylning asl nomini saqlaydi;
  • $_FILES["myFile"]["type"] - faylning mim turini saqlaydi;
  • $_FILES["myFile"]["size"] - fayl hajmini saqlaydi (baytlarda);
  • $_FILES["myFile"]["tmp_name"] - vaqtinchalik fayl nomini saqlaydi;
  • $_FILES["myFile"]["error"] - uzatish natijasida olingan xato kodini saqlaydi.

move_uploaded_file() funksiyasidan foydalanib, faylni uning vaqtinchalik katalogidan doimiy joyga koʻchirishimiz mumkin. Bu maqsadda uni copy() va rename() oʻrniga ishlatish ham yaxshi amaliyotdir, chunki u fayl haqiqatda HTTP POST soʻrovi orqali yuklab olinganligiga ishonch hosil qilish uchun qoʻshimcha tekshiruvlarni amalga oshiradi.

Agar siz faylni foydalanuvchi tomonidan taqdim etilgan asl nom bilan saqlamoqchi bo'lsangiz, uni xavfsiz bajarishingiz tavsiya etiladi. Fayl nomi maqsad yo'liga ta'sir qilishi mumkin bo'lgan belgilarni o'z ichiga olmasligi kerak, masalan, qiyshiq chiziq. Fayl nomi bir xil nomdagi mavjudlarini qayta yozmaslik uchun noyob bo'lishi kerak (agar ilovangiz buni taqdim qilmasa). Buni har qanday belgilarni harf bo'lmagan pastki chiziq bilan almashtirish va agar shunday nomdagi fayl mavjud bo'lsa, ortib borayotgan raqamni qo'shish orqali ta'minlashingiz mumkin.

PHP yordamida faylni yuklab olish va qabul qilish shunday ko'rinadi:

Aniqlash("YUKLASH_DIR", "/srv/www/uploads/"); if (!empty($_FILES["myFile"])) ( $myFile = $_FILES["myFile"]; if ($myFile["error"] !== UPLOAD_ERR_OK) ( echo "

Xatolik yuz berdi.

"; exit; ) // xavfsiz fayl nomiga ishonch hosil qiling $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile["name"]); // bajaring mavjud faylni qayta yozmang $i = 0; $parts = pathinfo($name) while (fayl_mavjud(UPLOAD_DIR . $name)) ( $i++; $name = $parts["filename"] . "-" . $i . ". " $parts["extension"] ) // faylni vaqtinchalik katalogdan saqlang $success = move_uploaded_file($myFile["tmp_name"], UPLOAD_DIR. if (!$success) ( echo "); "; exit; ) // yangi chmod fayli uchun to'g'ri ruxsatlarni o'rnating (UPLOAD_DIR . $name, 0644 )

Avval biz PHP faylini serverga yuklash xatosiz o'tganiga ishonch hosil qilamiz. Keyin yuqorida aytib o'tganimdek xavfsiz fayl nomini belgilaymiz va keyin move_uploaded_file() yordamida faylni maqsadli katalogiga o'tkazamiz. Nihoyat, yangi fayl kerakli ruxsatlarga ega bo'lishini ta'minlash uchun chmod() ni chaqiramiz.

Xavfsizlik masalalari

Ulardan biri yuklanayotgan fayl turini, qanday bo'lishi kerakligini tekshirish. $_FILES["myFile"]["type"] qiymatiga yoki fayl nomi kengaytmasiga tayanish xavfsiz emas, chunki ikkalasini ham osongina aldash mumkin. Buning o'rniga, fayl mazmunini tekshirish va uning GIF, JPEG yoki boshqa qo'llab-quvvatlanadigan rasm formatlaridan biri ekanligini aniqlash uchun exif_imagetype() funksiyasidan foydalaning. Agar exif_imagetype() mavjud bo'lmasa (funktsiya Exif kengaytmasini yoqishni talab qiladi), getimagesize() dan foydalanishingiz mumkin. Unga qaytarilgan massiv, agar tanilgan bo'lsa, tasvir turini o'z ichiga oladi.

// GIF, JPEG yoki PNG faylni tekshiring $fileType = exif_imagetype($_FILES["myFile"]["tmp_name"]); $ruxsat berilgan = massiv(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG); agar (!in_array($fileType, $allowed)) ( // fayl turiga ruxsat berilmagan...

Tasvir bo'lmagan fayllar uchun unix fayl yordam dasturini chaqirish uchun exec() dan foydalanishingiz mumkin. kutilgan joylarda ma'lum ikkilik imzolarni izlash orqali fayl turini aniqlaydi.

// PDF faylni tekshiring $mime = "application/pdf; charset=binary"; exec("file -bi " . $_FILES["mening faylim"]["tmp_name"], $out); agar ($out != $mime) ( // fayl PDF emas ...

Yana bir qadam, POST so'rovining umumiy hajmiga va yuklanishi mumkin bo'lgan fayllar soniga qat'iy cheklovlar qo'yishdir. Buning uchun php.ini da upload_max_size , post_max_size va max_file_uploads direktivalari uchun mos qiymatni belgilang. upload_max_size direktivasi maksimal fayl yuklash hajmini belgilaydi. Yuklash hajmiga qo'shimcha ravishda siz butun POST so'rovining hajmini post_max_size direktivasi bilan cheklashingiz mumkin. max_file_uploads yangi direktivdir (5.2.12 versiyasida qo'shilgan) fayllarni yuklash sonini cheklaydi. Ushbu uchta ko'rsatma saytingizni shiddatli tajovuzlarni keltirib chiqarish orqali uning mavjudligini buzishga harakat qiladigan hujumlardan himoya qilishga yordam beradi. tarmoq trafigi yoki tizimni yuklash.

Post_max_size = 8M upload_max_size = 2M max_file_loads = 20

Xavfni minimallashtirish uchun qilishingiz mumkin bo'lgan uchinchi qadam yuklab olingan fayllarni virus skaneri bilan skanerlashdir. Bu keng tarqalgan viruslardan himoya qilish uchun juda muhimdir va zararli dastur, ayniqsa sizning saytingiz turli odamlar o'rtasida fayllar almashsa, masalan, veb-elektron pochta mijoziga yoki (huquqiy) fayl almashish saytiga qo'shimchalar. Mavjud PHP kengaytmasi ClamAV-ga kirishni ta'minlaydi, lekin, albatta, yordam dasturiga qo'ng'iroq qilishingiz mumkin buyruq qatori ClamAV xuddi men fayl uchun ko'rsatganimdek.

Exec("clamscan --stdout " . $_FILES["myFile"]["tmp_name"], $out, $return); if ($return) ( // fayl zararlangan...

Xulosa qilish va xulosalar chiqarish

Bugun siz veb-saytingiz yoki veb-ilovangizdan serverga fayllarni yuklashning PHP jarayonini qanday sozlash va amalga oshirishni o'rgandingiz. Yuklab olish muvaffaqiyatli bo'lishi uchun, HTML shakli Bir nechta ma'lumotlarni formatlash bilan POST so'rovi orqali yuborilishi kerak va PHP file_uploads direktivasi yordamida belgilangan tarzda yuklashga ruxsat berishi kerak. Fayl uzatilgandan so'ng, yuklashni qayta ishlash uchun mas'ul bo'lgan skript faylni vaqtinchalik katalogdan kerakli joyga ko'chirish uchun $_FILES massividagi ma'lumotlardan foydalanadi. Shuningdek, men o'zingizni va foydalanuvchilaringizni fayllarni yuklab olish bilan bog'liq ba'zi xavflardan himoya qilish uchun ko'rishingiz mumkin bo'lgan ba'zi qo'shimcha ehtiyot choralarini aytib berdim. Xavfsizligingizni ta'minlash uchun fayl turini tekshiring, trafikni yuklashga qat'iy cheklovlar qo'ying va viruslarni skanerlashdan foydalaning.

Qiziq bo'lishi mumkin bo'lganlar uchun, qo'shimcha kod ushbu maqola uchun GitHub-da mavjud. Faylni yuklash jarayoni qanday ishlashini yaxshiroq tushunish uchun siz omborni ko'rib chiqishingiz, yuklab olishingiz yoki klonlashingiz va kod bilan o'ynashingiz mumkin.

Ko'p qismli shakllar

  • Veb-interfeyslar pochta xizmatlari, bu sizga xatga qo'shimcha (ilova) qo'shish imkonini beradi va buning uchun siz avval faylni serverga yuklashingiz kerak va shundan keyingina uni xatga qo'shish mumkin;
  • Fayllarni serverga yuklash mexanizmisiz mavjud bo'lmagan interaktiv foto galereyalar va fotoalbomlar;
  • Turli xil dasturlarning fayllarini almashish uchun foydalaniladigan bepul dasturiy ta'minot portallari va boshqalar.

Faylni serverga yuklash faylni yuklash maydoniga ega bo'lgan ko'p qismli shakl yordamida amalga oshiriladi. Enctype parametri multipart/form-data ga o'rnatiladi:



Berilgan ko'p qismli shakl shunday ko'rinadi (siz serverga kichik fayl yuklash orqali ko'p qismli shakllar natijasini ko'rish uchun undan foydalanib ko'rishingiz mumkin):

Ko'p qismli shakllar odatda POST yuborish usulidan foydalanadi. Oldingi misoldan ko'rinib turibdiki, bu shakl ikkita maydonga ega:

  • Yuklash uchun fayl tanlash maydoni ;
  • Serverda bo'ladigan fayl nomini ko'rsatish uchun maydon .

Ko'p qismli shakllarni qayta ishlash

Ko'p qismli shaklni qayta ishlash uchun skript yozishni boshlashdan oldin, siz konfiguratsiya faylini tahrirlashingiz kerak php.ini fayllarni serverga yuklashga ruxsat berish.

Konfiguratsiya PHP fayli php.ini serverga fayllarni yuklash bilan bog'liq uchta parametrga ega:

  • file_uploads=On - fayllarni HTTP orqali serverga yuklash imkonini beradi;
  • upload_tmp_dir=/tmp - yuklangan fayllarni vaqtincha saqlash uchun katalogni o'rnatadi;
  • upload_max_filesize=2M - yuklangan fayllarning maksimal hajmini belgilaydi.

Agar veb-serveringiz operatsion tizim ostida ishlayotgan bo'lsa Linux tizimlari, keyin xizmatni qayta ishga tushirishingiz kerak:

httpd xizmatini qayta ishga tushiring

PHP ko'p qismli shakllar bilan qanday ishlaydi? Faylni qabul qilgandan so'ng, uni tasodifiy tanlangan fayl nomi bilan upload_tmp_dir nomli vaqtinchalik katalogga saqlaydi. Keyin u $_FILES to'rtta superglobal massiv o'zgaruvchilarini yaratadi. Ushbu massiv yuklab olingan fayl haqida ma'lumotni o'z ichiga oladi.

Yuklangan fayllar uchun belgilangan o'zgaruvchilar PHP versiyasiga va joriy konfiguratsiyaga bog'liq. $_FILES superglobal massivi PHP 4.1.0 dan beri mavjud. Agar register_globals konfiguratsiya direktivasi o'rnatilgan bo'lsa yoqilgan, qo'shimcha ravishda tegishli nomga ega o'zgaruvchilar e'lon qilinadi. 4.2.0 versiyasidan boshlab register_globals opsiyasi uchun standart qiymat hisoblanadi o'chirilgan.

Bizning misolimiz uchun $_FILES massivining mazmuni quyida ko'rsatilgan. E'tibor bering, bu yuklangan fayl nomi yuqoridagi ko'p qismli shaklga muvofiq fayl tanlash maydoni uchun ishlatiladi. Albatta, maydon nomi har qanday bo'lishi mumkin.

  • $_FILES["uploadfile"]["name"] - faylning serverga yuborilishidan oldingi nomi, masalan, pict.gif;
  • $_FILES["uploadfile"]["size"] - qabul qilingan faylning baytdagi hajmi;
  • $_FILES["uploadfile"]["type"] - qabul qilingan faylning MIME turi (agar brauzer uni aniqlay olgan bo'lsa), masalan: image/gif, image/png, image/jpeg, text/html;
  • (faylni yuklash maydoni deb ataganmiz) - vaqtinchalik katalogdagi fayl nomini o'z ichiga oladi, masalan: /tmp/phpV3b3qY;
  • $_FILES["uploadfile"]["xato"] - Faylni yuklab olishda yuzaga kelishi mumkin bo'lgan xato kodi. Kalit ["xato"] PHP 4.2.0 da qo'shilgan. Tegishli xato kodlarini ko'rishingiz mumkin

Skript tugagandan so'ng, vaqtinchalik fayl o'chiriladi. Bu skript tugashidan oldin uni boshqa joyga nusxalashimiz kerakligini anglatadi. Ya'ni, faylni serverga yuklash uchun skriptning algoritmi quyidagicha:

Agar "Yuborish" tugmasi bosilsa, fayl allaqachon serverga yuklanadi va uning nomi $_FILES["uploadfile"]["name"] o'zgaruvchisida bo'ladi. Bunday holda, skript darhol nomlangan faylni nusxalashi kerak $_FILES["uploadfile"]["tmp_name"] ba'zi bir katalogga (ushbu katalogga yozish huquqlari talab qilinadi).

Funktsiya yordamida fayl nusxalanadi nusxa ko'chirish() :

Ko‘chirish funksiyasidan emas, faqat copy() nusxa ko‘chirish funksiyasidan foydalaning, chunki:

  • Vaqtinchalik fayl avtomatik ravishda o'chiriladi;
  • Vaqtinchalik katalog boshqa ommaviy axborot vositalarida bo'lsa, xato xabari ko'rsatiladi.

Aytaylik, veb-serverning asosiy katalogida (DocumentRoot katalogida) joylashgan yuklashlar katalogiga fayl yuklashimiz kerak.

// Har ehtimolga qarshi katalog yaratamiz. Agar u allaqachon yaratilgan bo'lsa,
// biz xato xabarini ko'rmaymiz, chunki @ operatoridan foydalanamiz:

@mkdir("yuklashlar", 0777);

// /tmp dan faylni yuklash uchun nusxalash
// Fayl nomi serverga yuborishdan oldingi kabi bo'ladi:

Nusxalash($_FILES["uploadfile"]["tmp_name"],"uploads/".basename($_FILES["uploadfile"]["name"]));

Linuxda hamma narsa ancha murakkab - biz yuklashlar katalogining ruxsatlarini hisobga olishimiz kerak. Bu holatda, ehtimol, funktsiya mkdir() ishlamaydi, chunki bizda DocumentRoot katalogiga yozish uchun ruxsat yo'q (odatda /var/www/html yoki /home/httpd/html). Ildiz sifatida tizimga kiring, yuklashlar katalogini yarating va uning egasi va ruxsatlarini quyidagicha o'zgartiring:

// Yuklashlar katalogini yarating

// Apache egasi nomini va uning guruhini o'rnating - shuningdek apache:

Chown apache: apache yuklamalari

// Hammaga yozishga ruxsat bering (777) + yopishqoq bitni (1) o'rnating:

Chmod 1777 yuklash

Agar xohlasangiz, fayl hajmi cheklangan bo'lishi mumkin, siz .htaccess faylini tahrirlashingiz va yuklashlar katalogiga kirishni cheklashingiz mumkin - katalogga kirishi mumkin bo'lgan aniq foydalanuvchilarni yoki IP manzillarini belgilang;

Endi siz fayllarni serverga yuklashingiz mumkin.

Fayllarni serverga yuklash uchun PHP skriptini yozish


// Biz faylni oladigan katalog:
$uploaddir = "./files/" ;
$uploadfile = $uploaddir. basename($_FILES["yuklash fayli"]["ism"]);

// Fayllarni vaqtincha saqlash uchun katalogdan faylni nusxalash:
agar (nusxalash ($ _FILES [ "uploadfile" ][ "tmp_name" ], $uploadfile ))
{
aks-sado "

Fayl serverga muvaffaqiyatli yuklandi

" ;
}
boshqa (echo "

Xato! Fayl serverga yuklanmadi!

"
;

chiqish; )
aks-sado "

// Yuklab olingan fayl haqida ma'lumotni ko'rsatish:

"
;
aks-sado "

Serverga yuklangan fayl haqida ma'lumot: Yuklangan faylning asl nomi: "

" ;
aks-sado "

.$ _FILES [ "uploadfile" ][ "name" ]. " Yuklangan faylning mime turi: "

" ;
aks-sado "

.$ _FILES [ "yuklash fayli" ][ "turi" ]. " Yuklangan fayl hajmi baytda: "

" ;
aks-sado "

.$ _FILES [ "yuklash fayli" ][ "o'lcham" ]. " Vaqtinchalik fayl nomi: "

" ;

?>

.$ _FILES [ "uploadfile" ][ "tmp_name" ]. "

Bir nechta fayllarni yuklash, masalan, kirish yorlig'i uchun turli nom qiymatlari yordamida amalga oshirilishi mumkin.


Bundan tashqari, bir vaqtning o'zida bir nechta yuklab olingan fayllar haqida massivda tashkil etilgan ma'lumotlarni avtomatik ravishda olish mumkin. Ushbu xususiyatni amalga oshirish uchun HTML shaklidan massivni yuborish uchun bir nechta tanlash va belgilash maydonlari uchun bir xil sintaksisdan foydalaning:






Fayllarni yuborish Agar shunday shakl yuborilgan bo'lsa, $_FILES["userfile"] , $_FILES["userfile"]["name"] va $_FILES["userfile"]["size"] massivlari ishga tushiriladi (bir xilda). PHP 4.1.0 va undan keyingi versiyalari uchun $HTTP_POST_FILES kabi oldingi versiyalar

). Agar register_globals konfiguratsiya direktivasi on ga o'rnatilgan bo'lsa, unga hamroh bo'lgan global o'zgaruvchilar ham ishga tushiriladi. Ushbu o'zgaruvchilarning har biri olingan fayllar uchun tegishli qiymatlarning raqamli indekslangan massivi bo'ladi.

/home/test/some.html va /home/test/file.bin fayllari yuklangan deb faraz qilaylik. Bunday holda, $_FILES["userfile"]["name"] o'zgaruvchisi some.html qiymatiga ega bo'ladi va $_FILES["userfile"]["name"] o'zgaruvchisi file.bin qiymatiga ega bo'ladi. Xuddi shunday, $_FILES["userfile"]["size"] o'zgaruvchisi some.html faylining hajmini va hokazolarni o'z ichiga oladi. O'zgaruvchilar $_FILES["userfile"]["name"] ,$_FILES["userfile"]["tmp_name"]

, $_FILES["userfile"]["size"] va $_FILES["userfile"]["type"] ham ishga tushiriladi.

Xulosa:



<<< Назад Ko'rib turganingizdek, faylni serverga yuklashni tashkil qilish unchalik qiyin emas. Kerakli darajadagi xavfsizlikni ta'minlash qiyinroq, chunki serverga fayllarni yuklash tajovuzkorlar tomonidan serverga hujum qilish uchun ishlatilishi mumkin. Yuklashlar bilan ishlashda kerakli xavfsizlik darajasini qanday ta'minlash haqida ma'lumot olish uchun qarang. Tarkib
Oldinga >>>
Ulanish