Pag-aaral na magtrabaho sa mga kahilingan sa GET at POST. Perl - Magpadala ng mga file sa HTTP server na may kahilingan Inurl post magdagdag ng php username rough

Hulyo 2, 2009 nang 4:05 ng hapon

Perl - Pagpapadala ng mga file sa isang HTTP server na may kahilingan

  • Perl

Sa katunayan, walang orihinal, may sapat na dokumentasyon, kahit na higit pa rito, kahit na ang huli ay nagdudulot ng napakalakas na kapanglawan. Samakatuwid, mas madaling ipakita nang isang beses kung paano at kung ano ang ginagawa kaysa magbasa ng sampung beses at tumapak sa rake. Kundisyon: Mayroong ilang mga binary file na lokal na matatagpuan, mayroong isang server kung saan dapat nating ilagay ang mga file na ito, sa server na ito ay mayroong isang script (form processor) na nag-upload ng mga file
Gawain: Ang mga file na ito ay kailangang idagdag sa pamamagitan ng web interface (form handler) sa server, na para bang isa kaming browser at ipinadala ang data sa pamamagitan ng form.

Gamit ang LWP::UserAgent

Algoritmo ng pagbuo ng kahilingan:
  • Lumikha ng kahilingan (HTTP::Request);
  • Lumikha ng "browser" (LWP::UserAgent);
  • Tinutukoy namin ang mga header para dito;
  • Magpadala ng kahilingan;
Ito ay nakakapagod tulad ng XML::LibXML, ngunit ito ay maaasahan, kaya: Perl code (1) #!/usr/bin/perl gumamit ng mahigpit; gumamit ng mga babala; gumamit ng LWP::UserAgent; # Ito ang file na ipapadala ng aking $file = "./files/some_file.bin"; # Ito ang URI kung saan ipapadala namin ang kahilingan my $uri = "http://somedomain.com/form/action/script"; # Request object my $request = HTTP::Request->new("POST", $uri); # Bumubuo kami ng isang separator, dahil kung hindi namin ito pipilitin, sa pamamagitan ng $ua->request($request) ay hindi ito isasama sa pangunahing header # kahit na maaari kang gumawa ng $request->as_string pagkatapos mabuo ang header object , pagkatapos ay ang default ay papalitan, ngunit huwag nating ipagsapalaran ang aking $boundary = "X"; my @rand = ("a".."z", "A".."Z"); para sa (0..14) ($boundary .= $rand;) # Bumuo ng header: $request->header("Content-Type" => "multipart/form-data; boundary=".$boundary); $request->header("User-Agent" => " Mozilla Firefox 5.0 :-)"); $request->header("Referer" => " http://somedomain.com/form"); $request->protocol("HTTP/1.0"); # Bagama't gagawin ito ng LWP::UserAgent, mas mabuti ito kaagad # Pagbuo ng regular, mga parameter ng text form my $field = HTTP::Message->new([ "Content -Disposition" => "form-data; name=" fieldname"", "Content-Type" => "text/plain; charset=utf-8", ]); # Pinapalitan namin ang HTTP::Headers header kapag gumagawa ng HTTP::Message object $field->add_content_utf8(" medyo halaga"); # Gaya ng nakikita mo, ang ilang halaga ay dapat nasa UTF-8 $request->add_part($field); # ... At iba pa, para sa bawat field ng text... # Pagbuo ng binary parameters ng form na bukas (aking $fh,"<", $file); # А можно сначала сделать заголовок, а потом уже применить к HTTP::Message my $size = (stat $file); my $header = HTTP::Headers->bago; $header->header("Content-Disposition" => "form-data; name=" file "; filename=" somefile.bin "); # Bagama't maaaring kalkulahin ang pangalan ng file mula sa pangalan ng file na $header->header("Content-Type" => " application/octet-stream<$fh>"); # O naaayon sa file type my $file_content = HTTP::Message->new($header); $file_content->add_content($_) habang

;

$request->add_part($file_content); malapit $fh; # ... At iba pa, para sa bawat file... my $response = $ua->request($request); if ($response->is_success) ( print $response->content ) else ( die $response->status_line ) fieldname Gamit ang Socket medyo halaga"); # At dito rin utf8 $request->add_part($field); # ... At iba pa, para sa bawat text field... # Susunod, hinahati namin ang aming kahilingan, ngunit walang mga file, sa pangunahing header at ang unang bahagi ng nilalaman # Hinahati namin sa isang regular na expression dahil ang $request->headers->as_string ay hindi nagbabalik sa unang linya ng kahilingan, lalo na ang POST command, # at siyempre maaari mong kolektahin ang linya sa iyong sarili, ngunit ako Masyado akong tamad. =~ m/^(.+?)\n\n(.+)$/s; # Wala kaming sapat na content, kaya pinutol namin ito -- $content = substr($content , 0, -4); parehong hangganan $content =~ s/(\-\-[^\n]+)$//s; haba $content # Ngayon ang aming mga file: my $files = ; my $size = (stat $file); my $f_header = HTTP::Header->new; -data; $header->header("Content-Disposition" => "form-data; name=" file "; filename=""); $f_header->header("Content-Type" => " "); # Bagama't maaaring kalkulahin ang pangalan ng file mula sa pangalan ng file na $header->header("Content-Type" => ""); $f_header = $boundary."\n".$f_header->as_string."\n"; # Idagdag sa haba ng kahilingan $length += length $f_header; $length += $size; # Actually , ang pamamaraan ay nasa ibaba lamang para sa mga kaso kapag mayroong maraming mga file # Pagkatapos, kailangan muna nating kalkulahin ang haba ng nilalaman, dahil ito (ang haba) ay ipahiwatig sa pangunahing header na push @($files), (header => $f_header, file => $file); # ... At iba pa, para sa bawat file... # Kaya handa kaming lahat $length += haba $boundary."--"; bilangin din ang end line # Buksan ang socket my $socket = IO::Socket: :INET->new($domain.":".$port) || die $!; # Sa pangunahing haba ng header .= "\nContent-Length: ".$length; # Ipadala ang header at ang unang ( text) na bahagi ng content ay naka-print $socket $head "\n\n"; file (@($files)) (print $socket $file->(header); (my $fh, "<", $file->(file));<$fh>i-print ang $socket $_while<$socket>;

Sa araling ito titingnan natin ang mga pamamaraan para sa pagpasa ng data sa pagitan ng mga form at mga pahina. Ang mga ganitong pamamaraan ay POST at GET. Pag-uusapan natin ang bawat isa nang hiwalay at mas detalyado. Sa pangkalahatan, ito ay kinakailangan para sa komunikasyon sa pagitan ng mga form. Halimbawa, pinupunan namin ang ilang mga patlang sa isang pahina at kailangan naming ilipat ang mga ito sa isa pang pahina para sa pagproseso.

GET method sa PHP

Una, tingnan natin ang GET method. Ito ay kapag ang lahat ng mga variable at ang kanilang mga halaga ay direktang ipinapasa sa address. Ngayon, gamit ang isang halimbawa, makikita mo ang lahat, at kahit na maunawaan kung paano gumagana ang karamihan sa mga site at forum.
Halimbawa, mayroon kaming isang html na pahina tulad nito:

Halimbawang pahina para sa pagpasa ng mga variable gamit ang Get link

Tingnan ang link? Ito ay kumplikado at binubuo ng ilang bahagi. Hatiin natin ito nang paisa-isa:
https://site— domain address o, bilang ito ay tinatawag ding, host.
index.php— isang pahina sa PHP na magpoproseso ng kahilingan.
? — simbolo ng paghihiwalay sa pagitan ng address at block na may mga variable.
Susunod na dumating ang mga variable at ang kanilang mga halaga, na pinaghihiwalay ng simbolo & .
pangalan=Sergey— ang variable ng pangalan at ang halaga nito Sergey.
edad=22- ang parehong bagay, variable na edad, halaga 22.

Inayos namin ang lahat, ngayon tingnan natin kung paano ito pinoproseso sa php gamit ang GET method.
Ang pahina ng index.php, tulad ng naaalala mo, ipinasa namin ito:

Una, isang payo: LAGING suriin ang iyong mga variable para sa kawastuhan: para sa kawalan ng laman, para sa pagsunod sa mga wastong halaga, at iba pa. Dahil ang lahat ay ipinadala sa pamamagitan ng address bar, ang data ay madaling mapapalitan at makapinsala sa site. Ngayon para sa code mismo: kami, gamit ang , ay nagsuri sa pangalan at mga variable ng edad para sa kawalan at, kung wala silang laman, ipinakita namin ang mga ito, at kung walang laman ang mga ito, iniulat lang namin ito.
Simple lang, hindi ka ba sang-ayon? Halimbawa, maaari kang lumikha ng isang html na pahina at gumawa ng mga link sa pamamagitan ng mga variable sa menu, at sa index.php iproseso ang variable at ipakita ang isang partikular na pahina depende sa natanggap na halaga. Well, pag-uusapan natin ito mamaya, sa isang artikulo tungkol sa paglikha ng isang website sa PHP mula sa simula. Upang hindi makaligtaan ang anuman, ipinapayo ko sa iyo na mag-subscribe sa RSS.

Paraan ng POST sa PHP

Upang ipakita kung paano gumagana ang pamamaraang ito, kakailanganin namin ng kaunti pa kaysa sa isang simpleng linya na may isang address :) Kakailanganin naming lumikha ng isang HTML na pahina na may isang form upang punan, ngunit iyan ay okay, magbibigay ako ng isang handa na halimbawa para sa iyo:

Halimbawang pahina para sa pagpasa ng mga variable gamit ang Post

Punan ang mga patlang upang maglipat ng impormasyon:

Ilagay ang iyong pangalan:

Mangyaring ipahiwatig ang iyong edad:



Kaya, gumawa kami ng isang html na pahina na may simpleng form. Tandaan, ang paraan ng POST ay maaari lamang gamitin sa isang form.
Ang unang parameter ng form ay "paraan", tinutukoy nito ang paraan na gagamitin namin para sa paglipat. Gaya ng nahulaan mo, ito ay GET o POST. Bukod dito, kung nakatakda ang GET, kung gayon ang lahat ng mga pangalan ng field (sa anyo ng mga variable na pangalan), pati na rin ang kanilang mga halaga, ay ipinasa sa pamamagitan ng sanggunian, tulad ng sa seksyon tungkol sa pamamaraan ng GET. Kung nakatakda ang POST, ang lahat ng mga variable na pangalan at halaga ay ipapadala bilang kahilingan sa browser sa web server. Ibig sabihin, hindi sila makikita sa address bar. Sa maraming mga kaso ito ay lubhang kapaki-pakinabang. Ang POST ay mas ligtas din, na mauunawaan, dahil ang mga variable na may kanilang mga halaga ay hindi na madaling i-edit, kahit na posible rin.

Ang pangalawang form na parameter ay "aksyon". Ito ang path at pangalan ng script file kung saan ipinapasa namin ang data. Sa aming kaso ito ay index.php. Ang landas na ito ay maaaring maipadala nang buo, iyon ay, tulad nito: aksyon = "https://my_site.ru/index.php". Kung hindi mo tinukoy ang halaga ng parameter na "pagkilos", ang lahat ng impormasyon ay ililipat sa pangunahing script, iyon ay, ang index page na index.php ng ​​iyong site, na medyo lohikal.

Ngayon ay kukuha kami ng data mula sa aming form. Dahil ipinasa namin ito sa index.php, nasa ibaba ang code ng partikular na pahinang ito:

"; echo "pangalan - "; echo $_POST["user_name"]; echo "
edad - "; echo $_POST["age"]; echo " years"; ) else ( echo "Hindi dumating ang mga variable. Suriin muli ang lahat."; ) ?>

Huwag kalimutang suriin kung walang laman at wastong mga halaga. Susunod, kailangan naming linawin kung bakit ang aming mga variable ay tinatawag na user_name at edad? At tingnan ang mga patlang ng form na nilikha namin sa itaas. Tingnan mo doon input name="user_name" type="text"? Dito tinutukoy ng parameter ng pangalan ang pangalan ng variable na makukuha natin gamit ang field na ito. Ganun din sa edad. sana malinaw. Well, ang pagkuha ng variable at ang halaga nito sa pamamagitan ng POST ay halos hindi naiiba sa GET, na tinalakay namin sa itaas.

Well, ito ay naging isang malaking aral, ngunit isa sa mga pinaka-kapaki-pakinabang, dahil ang pagpasa ng mga variable sa pagitan ng mga form at mga pahina ay eksaktong interaktibidad kung saan ginagamit namin ang PHP.

Maaaring napansin mo na sa karamihan ng mga site ay makikita mo ang mga sumusunod na address:

Http://site/index.php?blog=2

Dito, kahit hindi mo alam ang php, maaari mong hulaan na nag-a-access kami ng isang file index.php Ngunit kakaunti ang nakakaalam kung ano ang darating pagkatapos ng tandang pananong. Ito ay medyo simple: ?blog=2 Ito ay isang deklarasyon ng pandaigdigang variable na "$_GET["blog"]" na may halagang "2". Kaya, ipinapasa ko ang isang variable sa script na responsable para sa pagpapakita ng impormasyon mula sa database. Sumulat tayo ng isang maliit na script kung saan malinaw mong makikita ang lahat:

if(isset($_GET["blog"])) (
echo $_GET["blog"];
}
?>

Ginagamit namin ang if() condition operator at ang sumusunod na linya ay ginagamit bilang isang kundisyon:

Isset($_GET["blog"])

isset() ay nagbibigay-daan sa iyo upang malaman kung ang variable na tinukoy sa mga bracket ay umiiral, iyon ay, ang kundisyong inilarawan ko sa code ay parang ganito: Kung ang variable na $_GET["blog"] ay umiiral, pagkatapos ay ipakita ang mga nilalaman ng variable na ito sa screen. Narito ang nangyari:

Sa tingin ko, malinaw ang isang pandaigdigang variable na nilikha $_GET kasama ang identifier na idineklara namin sa address bar ( sa kasong ito na may identifier na "blog")

Ngayon gusto kong linawin ang isang punto. Ipagpalagay na kailangan nating magdeklara ng dalawang variable, paano ito gagawin? Ang unang variable ay idineklara pagkatapos ng tandang pananong "?" Ang pangalawang variable ay idineklara pagkatapos ng "&" sign ( Sa totoo lang, hindi ko alam kung ano ang sign na ito), narito ang isang halimbawang deklarasyon ng tatlong variable:

Http://site/index.php?a=1&b=2&c=3

Narito ang output code:

if(isset($_GET["a"]) AND isset($_GET["b"]) AND isset($_GET["c"])) (
echo $_GET["a"]."
";
echo $_GET["b"]."
";
echo $_GET["c"]."
";
}
?>

Ang kundisyon ay parang ganito:

Kung mayroong global variable na $_GET["a"] at global variable na $_GET["b"] at global variable na $_GET["c"] pagkatapos ay ipakita ang mga ito sa screen, narito ang resulta:

Mga porma

Bago tayo makarating post mga kahilingan, kailangan mong maunawaan kung ano ang mga form? Bakit kailangan? Dahil ang pandaigdigang variable na $_POST[""] ay nilikha sa pamamagitan ng mga form. Ano ang anyo? Ang mga ito ay mga patlang para sa gumagamit upang magpasok ng ilang impormasyon. May mga one-line na field, malalaking field, at mga radio button at check box din. Ayusin natin ang lahat ng bagay...

Ang form ay isang tag:


mga elemento ng form

Ang form ay may mga katangian, ililista ko ang mga pinakakaraniwan:

Gumawa tayo ng isang form:


mga elemento ng form

Itinakda ko ang file bilang handler file pagsubok.php dahil dito ako nagsusulat ng mga halimbawa para sa iyo. Itinakda ko ang paraan ng pagpapadala upang mag-post dahil ito ang mga pamamaraan na ginagamit sa 99.9% ng mga kaso. Binigyan ko rin ng pangalan - form ang aming form

Ngayon ay lumusot tayo sa mundo ng mga elemento ng form. Ang unang bagay na kailangan mong maunawaan ay halos lahat ng mga elemento ay isang tag ang pagkakaiba lang ay nasa katangian uri sa mga tag na ito. Hayaan akong ilista ang mga elemento ng form na ginamit:

Sigurado akong nakita mo ang mga ganoong field nang higit sa isang beses, kaya narito ang sinasabi nila: "walang komento"

Ngayon, gumawa tayo ng isang maliit na palatanungan sa pagsasanay, na gagawin pa natin. Ang aming gawain ay lumikha ng isang maliit na palatanungan na magsasabi sa amin ng pangalan ng taong pumupuno dito, kasarian, saang bansa sila nagmula, paboritong kulay at isang field ng teksto kung saan maaaring magdagdag ang user tungkol sa kanilang sarili. Narito ang nakuha ko:

Iyong Apelyido Unang Pangalan Patronymic:

Ang iyong kasarian:
M
AT

Saang bansa ka galing?



(mga) paboritong kulay:

Itim:
Pula:
puti:
Isa pa:

Tungkol sa aking sarili:




Tandaan na halos bawat tag ay may katangian halaga, para saan ito? Itinatala nito ang data na ililipat mo sa ibang page. sana malinaw

Ngayon kung patakbuhin natin ang code na ito sa browser, makikita natin ang sumusunod:

Para sa form na ginamit ko ang katangian aksyon may kahulugan pagsubok.php nangangahulugan ito, gaya ng nasabi ko na, na ang data mula sa form ay ililipat sa test.php file.

hiling ng POST

Ngayon ay isulat natin ang PHP code na magpapahintulot sa atin na makita ang impormasyong ipinasok natin. Saan naka-imbak ang data? Sa kaso ng kahilingan sa pagkuha, ang aming data ay nasa pandaigdigang variable na $_GET[""]. Kapag gumagawa ng isang kahilingan sa pag-post, ang data ay maiimbak sa pandaigdigang variable na $_POST[""]. Sa mga square bracket, dapat kang magsulat, tulad ng sa kaso ng global variable get, isang identifier. Ang tanong, saan ko makukuha ang identifier na ito? Iyon ang dahilan kung bakit kailangan namin ang katangian ng pangalan sa mga elemento ng form! Ang mga pangalang ito ang nagsisilbing susi namin sa global post array. Well, simulan nating ilarawan ang script:

if(isset($_POST["isumite"))) (
echo "Buong pangalan: ".$_POST["fio"]."
";
echo "Kasarian: ".$_POST["sex"]."
";
echo "Bansa na tinitirhan: ".$_POST["lungsod"]."
";

Echo "(mga) paboritong kulay:
";
echo $_POST["kulay_1"]."
";
echo $_POST["kulay_2"]."
";
echo $_POST["kulay_3"]."
";
echo $_POST["kulay_4"]."
";
echo "Tungkol sa iyong sarili: ".$_POST["tungkol sa"]."


";
}
?>

Ang kung kundisyon na isinulat namin ay nagsasabing: Kung mayroong pandaigdigang variable na $_POST["isumite"] pagkatapos ay ipapakita namin ang data sa screen. Ang pandaigdigang variable na ito ay nilikha kung nag-click kami sa button na isumite, kaya naman sa halimbawang ito kailangan namin ang attribute ng pangalan sa button. Marahil ay nagtataka ka kung bakit opsyonal ang katangian ng pangalan ng button? Ito ay medyo simple. Karaniwan, hindi sinusubaybayan ng programmer ang pagpindot sa pindutan, sa halip ay sinusubaybayan ang data na ipinadala. Para sa tamang operasyon ng, halimbawa, isang contact form, ito ay kinakailangan upang subaybayan hindi ang pag-click ng isang pindutan, ngunit ang kawastuhan ng impormasyon na ipinasok, at upang malaman kung ang impormasyong ito ay naipasok sa lahat. Sa aming halimbawa, hindi namin sinuri ang ipinadalang data, ngunit sinusubaybayan lamang ang pagpindot sa pindutan, upang pasimplehin ang halimbawa... Ito ang nakuha namin:

Konklusyon

Kaya, ngayon ay tumingin kami sa dalawang paraan ng paglilipat ng data sa pagitan ng mga script, at nakilala rin namin ang mga form. Talagang inaasahan ko na ang impormasyong ito ay magiging kapaki-pakinabang sa iyo kahit saan man. Kung mayroon kang anumang mga katanungan o iniisip, magsulat ng mga komento. Good luck sa iyo, iyon lang para sa araw na ito!

P.S.: Gusto mo bang maging mas makatotohanan ang mga laro sa computer? Ang directx 11 para sa windows 7 ay maaaring ma-download nang libre sa windows in! Tangkilikin ang kahanga-hangang mga graphics!