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;
;
$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:
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:
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:
Ang form ay may mga katangian, ililista ko ang mga pinakakaraniwan:
Gumawa tayo ng isang 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: