Cum se trimite un fișier pe server

Cum se trimite un fișier pe server

În timpul dezvoltării unuia dintre proiecte, sa pus sarcina de a trimite o arhivă de fișiere de pe site-ul "A" pe site-ul "B", care în viitor ar trebui să fie dezvăluit pe site-ul "B". Și fișierul ar trebui să fie generat dinamic pe site-ul "A". și trimis offline din scriptul PHP fără participarea tuturor formelor posibile etc.







Am rezolvat această problemă în două moduri și vreau să le împărtășesc.

Metoda # 1: trimiterea unui fișier utilizând metoda POST

Ideea este că pe site-ul "A" se generează o solicitare "POST", care conține numele și conținutul fișierului care va fi trimis și trimis către site-ul "B". Pe site-ul "B", cererea POST este acceptată, iar conținutul specificat este scris în fișierul specificat.

Tehnologia pentru transferul unei solicitări POST dintr-un script PHP pe care l-am atribuit soclurilor.

Pentru a transfera date utilizând metoda POST, este necesară generarea unui șir care conține antetele de cerere și datele în sine.

O vizualizare de exemplu trimisă către server poate fi:

După cum puteți vedea, variabilele din cererea POST sunt setate ca în cererea GET, adică var1 = val1var2 = val2

Apoi, deschideți soclul folosind funcția fsockopen (). în cazul în care parametrii sunt trecute la numele domeniului, care trece cererea, numărul portului, o variabilă care conține un număr de eroare de transmisie (dacă este), o variabilă care conține descrierea erorii (dacă este), iar închiderea soclului atunci când nu este în uz (în secunde):

Returgem datele la soclul deschis și citim răspunsul serverului "B".

Ca rezultat al scriptului de pe site-ul "A", cererea POST către site-ul "B" pleacă. și anume în scriptul import.php. situat în rădăcina site-ului "B". Ie scriptul import.php este rulat. unde matricea $ _POST va fi disponibilă în script. conținând numele și conținutul variabilelor.

Tot ce avem nevoie este să deschideți un fișier numit $ _POST ['filename']. și scrie acolo datele din variabila $ _POST ['content'].

Asta e tot! Fișierul este acceptat și salvat!







Dar există o singură dată: fișierul poate fi de orice tip. Atât binar, cât și text. După cum ați văzut, conținutul fișierului este transferat în cererea POST în forma var1 = val1var2 = val2. și anume dacă <здесь содержимое файла file.zip> vor fi binare sau vor conține caractere semnificative de la adresa URL, atunci integritatea fișierului transmis poate fi încălcată sau fișierul nu va fi transmis deloc!

Pentru a evita acest lucru, conținutul fișierului trebuie să fie convertit într-o formă de adresă URL inactivă înainte de trimitere. Puteți face acest lucru folosind funcția base64_encode ().

și deja introduceți $ file_content în solicitarea POST:

În acest caz, conținutul fișierului va fi transmis într-o formă "sigură".

Primirea și "decodarea" conținutului unui fișier de pe site-ul "B" poate fi efectuată folosind funcția base64_decode ().

Trebuie remarcat faptul că această metodă funcționează bine pentru fișiere relativ mici (aproximativ 2 MB, pentru a obține o valoare mai exactă necesară să se uite la setările maxime PHP suma metoda POST datele primite).

Întâlnește doar restricția privind dimensiunea fișierului transferat, vă sugerez următoarea metodă de transfer de fișiere.

Metoda # 2: Trimiterea unui fișier utilizând metoda PUT

Așa cum am menționat deja, trimiterea fișierelor la un server de la distanță folosind POST prin socket-uri este bună pentru fișiere de dimensiuni mici. Pentru a transfera fișiere mari, trebuie să utilizați metoda de transfer PUT.

Pentru aceasta, utilizați biblioteca curl.

Pentru a transfera un fișier utilizând metoda PUT, trebuie să inițializăm sesiunea CURL, să setăm parametrii necesari pentru sesiune, să executăm solicitarea CURL și să închidem sesiunea.

Următorul exemplu arată transferul fișierului file.zip pe serverul "B".

După rularea acest script de pe site-ul „A“ de pe site-ul „B“ merge PUT-cerere, care se va vedea conținutul fișierului transmis și în cererea GET-va conține numele fișierului care urmează să fie transmis.

Apoi, trebuie să organizăm recepția fișierului pe site-ul "B".

Pentru aceasta, în scriptul import.php. situat pe site-ul "B". din matricea $ _GET trebuie să obținem numele fișierului și din fluxul de intrare - conținutul fișierului:

Această metodă poate transfera fișiere de volume mari.

De asemenea, ar trebui să menționăm că cele două moduri de transfer de fișiere de mai sus nu sunt singurele posibilități. De exemplu, puteți transfera fișiere din scripturile PHP pe serverele la distanță prin FTP (folosind aceleași funcții CURL sau PHP speciale, cum ar fi ftp_connect (), ftp_login (), ftp_put (), etc.). Dar, la urma urmei, accesul la site prin FTP poate fi dificil (nu se cunoaște numele de utilizator și parola sau au fost modificate pe server, dar nu au fost modificate în script-uri etc.). Și metoda specificată aici va funcționa corect pe orice tip de găzduire (cu excepția, probabil, unele găzduire gratuită, unde interzicerea recepției datelor de pe alte site-uri).







Trimiteți-le prietenilor: