Prijenos datoteka pomoću PHP-a na poslužitelj. Prijenos datoteke na poslužitelj pomoću JavaScripta i JQuery biblioteke Što je move_uploaded_file

U gotovo svakom projektu programer se suočava s potrebom za učitavanjem datoteka na poslužitelj. Fotografije, slike, dokumenti, arhive i još mnogo toga moguće je učitati na poslužitelj putem web sučelja (preko preglednika).


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

definira GET zahtjev za stranicu index.php. U ovom slučaju, skripti se prosljeđuju parametri "name" i "page" s vrijednostima "myname" odnosno "10". Kao što vidite, zahtjev se sastoji od parova "ime=vrijednost", spojenih sa "&". Zahtjev je odvojen od adrese stranice upitnikom "?".

Ali GET nije prikladan za prijenos velikih podataka. Za to postoji POST metoda. Ova metoda prenosi podatke skrivene od korisnika, a adresa stranice ostaje nepromijenjena. U teoriji, metoda POST omogućuje vam prijenos ogromnih blokova podataka, ali većina pružatelja usluga postavlja strogo ograničenje od 5-10 megabajta.

Za provedbu preuzimanja datoteke potrebno je korisniku osigurati odgovarajući obrazac. Oznaka za unos datoteke koristi se za učitavanje datoteka.

Odaberite datoteku za preuzimanje:

Korisnik odabire željenu datoteku, klikne gumb "Pošalji!", nakon čega preglednik prenosi navedenu datoteku na poslužitelj. Nakon preuzimanja datoteke, receiver.php se pokreće i automatski mu postaju dostupni svi podaci uneseni u obrazac.

Popis preuzetih datoteka pohranjen je u globalnom polju $_FILES. Ovo je asocijativni niz, gdje svaki element sadrži opis jedne od datoteka. Pogledajmo primjer:

Sve preuzete datoteke poslužitelj sprema u privremeni direktorij i automatski se brišu nakon završetka skripte. Ako trebate spremiti datoteku na poslužitelj, trebate je premjestiti u jedan od direktorija web stranice. Za to se koristi posebna funkcija move_uploaded_file(). Obično se koristi u kombinaciji s funkcijom is_uploaded_file(), koja vam omogućuje da odredite je li datoteka učitana putem obrasca. Na primjer:

Informacije o svakoj preuzetoj datoteci predstavljene su u skripti kao elementi niza $_FILES. Ime elementa određeno je atributom name oznake obrasca. U našem slučaju, atribut name jednak je "ufile", što znači da će podaci o ovoj datoteci biti pohranjeni u elementu $_FILES["ufile"].

Svaki element $_FILES također je niz koji sadrži pet elemenata s fiksnim imenima:

Veličina preuzetih datoteka može značajno varirati od pružatelja do pružatelja usluga. Neki administratori potpuno zabranjuju učitavanje datoteka. U tom slučaju, datoteka se još uvijek može preuzeti, poslužitelj će je izbrisati i obavijestiti skriptu da je datoteka bila tu, ali je već izbrisana.

Za izradu sustava za učitavanje slike ili bilo koje druge datoteke na poslužitelj koristi se HTML obrazac i PHP skripta za obradu podataka poslanih ovim obrascem. Na taj način su implementirani različiti servisi koji podržavaju učitavanje datoteka na poslužitelj. Implementiran je slično uobičajenom obliku slanja podataka na poslužitelj.

Obrazac za podnošenje HTML datoteke

Najjednostavniji oblik učitavanja datoteke je:





Kao rezultat toga dobivamo obrazac koji sadrži polje za odabir datoteke i gumb koji šalje podatke obrasca na poslužitelj:

Parametar entype prima vrijednost multipart/form-data u ovom obliku, što određuje da će se binarni podaci slati u ovom obliku, tj. datoteka. Ako ova vrijednost nije navedena, obrazac će zadano slati tekstualne informacije.

Parametar MAX_FILE_SIZE naveden u obrascu navodi maksimalnu veličinu datoteke, navedenu u bajtovima. Prema zadanim postavkama ovu veličinu određuju postavke poslužitelja.

Za označavanje preuzete datoteke oznaka mora sadržavati tip "datoteka", a također za daljnji rad PHP skripte mora biti navedena vrijednost "ime".

Slanje podataka obrasca vrši se pomoću oznake s tipom "submit". Prikazuje se uobičajenim gumbom.

PHP kod za spremanje datoteke

Zadatak ovog rukovatelja, nakon što primi podatke obrasca, provjerava ih za moguće pogreške, premješta privremenu datoteku primljenu od strane poslužitelja na željenu lokaciju sa zadanim imenom. Ovdje također mogu obavljati razne druge potrebne operacije - snimanje informacija u bazu podataka, stvaranje malih kopija slika, spremanje slika uz dodatak autorskih prava i još mnogo toga.

U prijemnom kodu, podaci datoteke sadržani su u superglobalnom polju $_FILES. Sukladno tome, možete vidjeti informacije o datoteci poslanoj iz obrasca u $_FILES["my_file"]. Takav niz sadrži sljedeće informacije:

Nakon primanja ovih informacija na poslužitelju, datoteka se mora kopirati u stalni direktorij, jer Privremena datoteka automatski će se izbrisati po dovršetku skripte.

Kopiranje se vrši pomoću funkcije copy() čiji su parametri naziv izvorne datoteke (u ovom slučaju naziv privremene datoteke je $_FILES["my_file"]["tmp_name"]) i naziv odredišnu datoteku.

Rezultat bi trebao biti sljedeći kod:

Kopiranje datoteke mora se izvesti u postojeću mapu na poslužitelju s postojećim pravima za stvaranje datoteka u njoj.

U ovom primjeru, naziv datoteke je isti kao izvorna datoteka koja se učitava. U stvarnosti se vrlo često naziv postavlja u skladu s vlastitim zahtjevima, najčešće se koristi datum i vrijeme preuzimanja, čime se osigurava jedinstvenost naziva datoteke. To vam omogućuje da smanjite pohranu i obradu datoteka na jedan standard. Ovdje, naravno, postoje dodatni zadaci pohranjivanja izvornog naslova u bazu podataka, ako je potrebno, ili određivanje ekstenzije preuzete datoteke. Ali u ovom slučaju bit će manje problema s kodiranjem naziva datoteke, a digitalni naziv datoteke može se koristiti za prikladno stvaranje poddirektorija za pohranjivanje preuzetih datoteka.

Funkcija copy() vraća true ako je kopiranje bilo uspješno i False ako je došlo do pogreške tijekom procesa kopiranja.

Ako je kopiranje uspješno, možete izvršiti sve potrebne radnje s datotekom prenesenom na poslužitelj.

Zadnja izmjena: 1.11.2015

Za prijenos datoteke na poslužitelj trebamo koristiti obrazac s parametrom enctype="multipart/form-data" i poljem $_FILES. Dakle, stvorimo datoteku upload.php sa sljedećim sadržajem:

Prenesi datoteku Odaberite datoteku:

Ovdje je obrazac definiran atributom enctype="multipart/form-data" . Obrazac sadrži posebno polje za odabir datoteke.

Sve prenesene datoteke završavaju u asocijativnom nizu $_FILES. Da biste utvrdili ima li uopće preuzetih datoteka, možete upotrijebiti konstrukciju if: if ($_FILES)

Niz $_FILES je dvodimenzionalan. Možemo prenijeti skup datoteka, a svaka učitana datoteka može se dohvatiti pomoću ključa koji odgovara vrijednosti atributa imena.

Budući da element za učitavanje datoteke na formu ima name="filename" , ovu datoteku možemo dobiti pomoću izraza $_FILES["filename"] .

Svaki objekt datoteke ima svoje parametre koje možemo dobiti:

    $_FILES["file"]["name"] : naziv datoteke

    $_FILES["file"]["type"] : vrsta sadržaja datoteke, npr. slika/jpeg

    $_FILES["file"]["size"] : veličina datoteke u bajtovima

    $_FILES["file"]["tmp_name"] : naziv privremene datoteke pohranjene na poslužitelju

    $_FILES["file"]["error"] : kod greške prilikom učitavanja

Također možemo provjeriti pogreške pri preuzimanju. Ako nemamo pogrešku, polje $_FILES["filename"]["error"] sadrži vrijednost UPLOAD_ERR_OK .

Kada učitate datoteku na poslužitelj, ona se prvo učitava na privremenu lokaciju, s koje se zatim premješta u direktorij poslužitelja pomoću funkcije move_uploaded_file().

Funkcija move_uploaded_file() uzima dva parametra: stazu do učitane privremene datoteke i stazu gdje bi se učitana datoteka trebala smjestiti.

Ograničenja i postavke preuzimanja

Prema zadanim postavkama, veličina učitanih datoteka ograničena je na 2 MB. Međutim, ovaj indikator možete konfigurirati u konfiguracijskoj datoteci. Promijenimo ovu brojku, na primjer, u 10 MB. Da biste to učinili, pronađite u datoteci php.ini sljedeći redak:

Upload_max_filesize = 2M

Promijenimo to u

Upload_max_filesize = 10M

Također možemo postaviti mapu za privremeno preuzete datoteke. Da biste to učinili u datoteci php.ini pronađimo sljedeći redak:

;upload_tmp_dir =

Promijenimo to u

Upload_tmp_dir = "C:/php/upload"

Također u php imeniku moramo stvoriti mapu za učitavanje.

Multiload

Promijenimo scenarij upload.php tako da podržava višestruko učitavanje:

Prijenos datoteke


Svako polje za odabir datoteke ima atribut name="uploads", tako da će poslužitelj tretirati skup učitanih datoteka kao jedan niz.

Zatim, koristeći foreach petlju, prolazimo kroz sve datoteke i spremamo ih u direktorij web stranice.

Vjerojatno su mnogi naišli na pitanje "Kako prenijeti datoteku na poslužitelj koristeći JS i JQuery?".
A to vjerojatno nisu svi mogli učiniti. Zapravo, sve nije tako teško kao što se čini.
U ovoj lekciji opisat ću proces učitavanja datoteke na poslužitelj (hosting).
Ajax tehnologija koristi se za razmjenu podataka između preglednika i web poslužitelja.
JQuery verzija korištena u receptu: 2.2.2.

Stvaramo primitivne oznake iz html, head i body oznaka.
U oznaci head trebate uključiti put do jquery biblioteke.
U primjeru koristim jquery s google poslužitelja.

U body tagu kreiramo obrazac koji se sastoji od input taga i gumba.
Pomoću input type="file" odabirete datoteku za učitavanje.
Oznaka gumba potrebna je za pokretanje js koda za prijenos datoteke.

Postavljamo obrazac name="uploader", enctype="multipart/form-data", method="POST".
Naziv obrasca: name="uploader"
Metoda kodiranja podataka obrasca: enctype="multipart/form-data"
Način prijenosa podataka: method="POST"

Pošalji ovu datoteku: Upload

Sav html i js kod za označavanje:
Pošalji ovu datoteku: Upload

Prijeđimo na kod java skripte.
Za prijenos datoteke morate prenijeti cijeli obrazac:
$("obrazac").submit(function(e) (

Podatke obrasca čitamo u varijablu:
var formData = new FormData($(ovo));

Zatim koristimo ajax tehnologiju za prijenos podataka na web poslužitelj.
Ako je prijenos datoteke uspješan, poruka će se prikazati u skočnom prozoru.
Ako se pojavi pogreška ili datoteka nedostaje, prikazat će se poruka s tekstom problema koji se pojavio.
$.ajax(( url: "file.php", tip: "POST", podaci: formData, async: false, uspjeh: funkcija (msg) ( upozorenje(msg); ), pogreška: funkcija(msg) ( upozorenje( "Pogreška!" cache: false, contentType: false, processData: false ));

Sav kod je u java skripti koristeći jquery:

Sada ostaje samo poslužiteljski kod za primanje podataka iz obrasca pomoću POST metode zahtjeva.

Dobivamo korijenski direktorij web mjesta i dodjeljujemo mapu za preuzimanje datoteka:
$uploaddir = $_SERVER["DOCUMENT_ROOT"].DIRECTORY_SEPARATOR."uploads".DIRECTORY_SEPARATOR;

Čitanje preuzete datoteke:
$uploadfile = $uploaddir. osnovno ime($_FILES["korisnička datoteka"]["ime"]);

Provjeravamo je li datoteka učitana.
Sukladno pristiglim podacima dodjeljujemo popratnu poruku.
Ako datoteka nije učitana, učitajte je u direktorij naveden u $uploadfile:
if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) ( $out = "Datoteka je važeća i uspješno je učitana.\n"; ) else ( $out = "Mogući napad učitavanjem datoteke !\n"; )

Kada se izvrše navedene radnje, vraća se odgovor.

Sav kod u php-u:

Sav html kod uključujući js:

Pošaljite ovu datoteku: Upload $("form").submit(function(e) ( var formData = new FormData($(this)); $.ajax(( url: "file.php", type: "POST", data: formData, async: false, uspjeh: funkcija (msg) ( alert(msg); ), error: function(msg) ( alert("Greška!"); ), cache: false, contentType: false, processData: false )); e.preventDefault();

Preuzmite datoteku izvornog koda:

Višedijelni obrasci

  • Web sučelja servisa e-pošte koja omogućuju dodavanje privitka (attach) pismu, a da biste to učinili prvo morate učitati datoteku na poslužitelj, a tek nakon toga se može dodati pismu;
  • Interaktivne foto galerije i foto albumi koji ne mogu postojati bez mehanizma za učitavanje datoteka na poslužitelj;
  • Portali besplatnog softvera koji služe za razmjenu datoteka raznih programa i sl.

Učitavanje datoteke na poslužitelj provodi se pomoću višedijelnog obrasca koji ima polje za učitavanje datoteke. Parametar enctype postavljen je na multipart/form-data :



Ovako će izgledati zadani višedijelni obrazac (možete ga pokušati upotrijebiti da biste vidjeli rezultat višedijelnih obrazaca učitavanjem male datoteke na poslužitelj):

Višedijelni obrasci obično koriste POST metodu podnošenja. Kao što možete vidjeti iz prethodnog primjera, ovaj obrazac ima dva polja:

  • Polje za odabir datoteke za učitavanje;
  • Polje za određivanje imena datoteke koju će imati na poslužitelju.

Obrada višedijelnih obrazaca

Prije nego počnete pisati skriptu za obradu višedijelnog obrasca, trebate urediti konfiguracijsku datoteku php.ini kako biste omogućili učitavanje datoteka na poslužitelj.

PHP konfiguracijska datoteka php.ini ima tri parametra povezana s učitavanjem datoteka na poslužitelj:

  • file_uploads=Uključeno - omogućuje učitavanje datoteka na poslužitelj putem HTTP-a;
  • upload_tmp_dir=/tmp - postavlja direktorij za privremenu pohranu učitanih datoteka;
  • upload_max_filesize=2M - postavlja maksimalnu veličinu učitanih datoteka.

Ako vaš web poslužitelj koristi Linux operativni sustav, morate ponovno pokrenuti uslugu:

ponovno pokretanje usluge httpd

Kako PHP obrađuje višedijelne obrasce? Nakon što primi datoteku, sprema je u privremeni direktorij pod nazivom upload_tmp_dir, s nasumično odabranim nazivom datoteke. Zatim stvara četiri superglobalne varijable niza $_FILES. Ovaj niz sadrži informacije o preuzetoj datoteci.

Varijable definirane za učitane datoteke ovise o PHP verziji i trenutnoj konfiguraciji. Superglobalni niz $_FILES dostupan je od PHP-a 4.1.0. U slučaju da je konfiguracijska direktiva register_globals postavljena na na, dodatno će se deklarirati varijable s odgovarajućim imenima. Od verzije 4.2.0, zadana vrijednost za opciju register_globals je isključeno.

Sadržaj polja $_FILES za naš primjer prikazan je u nastavku. Imajte na umu da ovo pretpostavlja da se naziv uploadfile koristi za polje za odabir datoteke, prema višedijelnom obrascu iznad. Naravno, naziv polja može biti bilo koji.

  • $_FILES["uploadfile"]["name"] - naziv datoteke prije slanja na poslužitelj, na primjer, pict.gif;
  • $_FILES["uploadfile"]["size"] - veličina primljene datoteke u bajtovima;
  • $_FILES["uploadfile"]["type"] - MIME tip primljene datoteke (ako ju je preglednik uspio otkriti), na primjer: slika/gif, slika/png, slika/jpeg, tekst/html;
  • (tako smo nazvali polje za učitavanje datoteke) - sadrži naziv datoteke u privremenom direktoriju, na primjer: /tmp/phpV3b3qY;
  • $_FILES["uploadfile"]["error"] - Kôd pogreške koji se može pojaviti prilikom učitavanja datoteke. Ključ ["greška"] je dodan u PHP 4.2.0. Možete vidjeti odgovarajuće kodove grešaka

Nakon dovršetka skripte, privremena datoteka bit će izbrisana. To znači da ga moramo kopirati na drugo mjesto prije nego skripta završi. To jest, algoritam za skriptu za prijenos datoteke na poslužitelj je sljedeći:

Ako se pritisne gumb "Pošalji", datoteka će već biti učitana na poslužitelj i njezin će naziv biti u varijabli $_FILES["uploadfile"]["name"]. U tom slučaju, skripta mora odmah kopirati datoteku s nazivom $_FILES["uploadfile"]["tmp_name"] u neki direktorij (potrebna su prava pisanja u ovaj direktorij).

Datoteka se kopira pomoću funkcije copy():

Koristite samo funkciju kopiranja copy(), a ne funkciju premještanja, jer:

  • Privremena datoteka će se automatski izbrisati;
  • Ako je privremeni imenik na drugom mediju, prikazat će se poruka o pogrešci.

Recimo da trebamo učitati datoteku u uploads direktorij, koji se nalazi u korijenskom direktoriju web poslužitelja (u DocumentRoot direktoriju).

// Napravimo imenik za svaki slučaj. Ako je već stvoren,
// nećemo vidjeti poruku o pogrešci jer ćemo koristiti operator @:

@mkdir("prijenosi", 0777);

// Kopiraj datoteku iz /tmp u prijenose
// Naziv datoteke bit će isti kao prije slanja na poslužitelj:

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

Na Linuxu je sve puno kompliciranije - moramo uzeti u obzir dopuštenja direktorija za upload. Najvjerojatnije u ovom slučaju funkcija mkdir() neće raditi jer nemamo dopuštenje za pisanje u direktorij DocumentRoot (obično /var/www/html ili /home/httpd/html). Prijavite se kao root, stvorite direktorij za prijenose i promijenite vlasnika i dopuštenja na sljedeći način:

// Stvorite direktorij za učitavanje

// Postavite ime vlasnika apachea i njegovu grupu - također apache:

Chown apache: Apache učitava

// Dopusti svima da pišu (777) + postavi ljepljivi bit (1):

Chmod 1777 učitava

Veličina datoteke može se ograničiti; ako želite, možete urediti .htaccess datoteku i ograničiti pristup direktoriju za učitavanje - navedite određene korisnike koji mogu pristupiti direktoriju ili IP adrese.

Sada možete učitati datoteke na poslužitelj.

Pisanje PHP skripte za učitavanje datoteka na poslužitelj

Učitavanje više datoteka može se implementirati pomoću, na primjer, različitih vrijednosti naziva za ulaznu oznaku.

Također je moguće automatski dobiti informacije organizirane u niz o nekoliko istovremeno preuzetih datoteka. Da biste implementirali ovu značajku, upotrijebite istu sintaksu za slanje niza iz HTML obrasca kao za višestruka polja odabira i potvrdnog okvira:


Pošalji ove datoteke:






Ako je takav obrazac poslan, nizovi $_FILES["userfile"], $_FILES["userfile"]["name"] i $_FILES["userfile"]["size"] bit će inicijalizirani (u istom način , poput $HTTP_POST_FILES za PHP 4.1.0 i ranije). Ako je konfiguracijska direktiva register_globals postavljena na on, popratne globalne varijable će također biti inicijalizirane. Svaka od ovih varijabli bit će numerički indeksirano polje odgovarajućih vrijednosti za primljene datoteke.

Pretpostavimo da su učitane datoteke /home/test/some.html i /home/test/file.bin. U ovom slučaju, varijabla $_FILES["userfile"]["name"] će imati vrijednost some.html, a varijabla $_FILES["userfile"]["name"] će imati vrijednost file.bin. Isto tako, varijabla $_FILES["userfile"]["size"] će sadržavati veličinu some.html datoteke i tako dalje.

Varijable $_FILES["userfile"]["name"] , $_FILES["userfile"]["tmp_name"] , $_FILES["userfile"]["size"] i $_FILES["userfile"]["type "] također će se pokrenuti.

Zaključak:

Kao što vidite, organiziranje prijenosa datoteka na poslužitelj nije tako teško. Teže je osigurati potrebnu razinu sigurnosti jer učitavanje datoteka na poslužitelj napadači mogu iskoristiti za napad na poslužitelj. Za informacije o tome kako osigurati potrebnu razinu sigurnosti pri radu s prijenosima, pogledajte.



>
Ako imate još pitanja ili nešto nije jasno - dobrodošli u naš