Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: CURL i ladowanie plikow
Forum PHP.pl > Forum > PHP
moonraker
Witam,

Potrzebuje wypelnic na stronie serwisu, do ktorego kodow nie mam dostepu, formularz, ktory ma pare pol typu INPUT oraz 5 pol pod obrazki.

Kod wyglada mniej wiecej tak:

  1.  
  2. $dane['zdjecie1'] = '@/sciezka/do/pliku.jpg';
  3. $dane['zdjecie2'] = '@/sciezka/do/pliku2.jpg';
  4.  
  5. $ch = curl_init();
  6. curl_setopt($ch,CURLOPT_URL, "http://www.jednadomena.cos/");
  7. curl_setopt($ch,CURLOPT_POST,1);
  8. curl_setopt($ch,CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1");
  9. curl_setopt($ch,CURLOPT_HEADER, 1);
  10. curl_setopt($ch,CURLOPT_COOKIEFILE,ROOT_TMPPATH.'/cookies.txt');
  11. curl_setopt($ch,CURLOPT_COOKIEJAR, ROOT_TMPPATH.'/cookies.txt');
  12. curl_setopt($ch,CURLOPT_POSTFIELDS,$dane);
  13. curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  14. curl_setopt($ch,CURLOPT_REFERER, 'http://www.jakasdomena.cos/");
  15. $result = curl_exec($ch);
  16. curl_close($ch);
  17.  




To ladnie dzialalo do zeszlego miesiaca. Rezultat jest taki:

1) Jezeli serwer to APACHE to wszystko jest OK i prosty kod na stronie <? print_r($_FILES); ?> zwroci ci trzeba. Testowalem to u siebie.
2) Jezeli serwer to LIGHTTPD to nie bedzie dzialalo. Serwer zwroci blad HTTP 1/1: 417 ;( pomaga dodanie do powyzszego:
  1. curl_setopt($ch,CURLOPT_HTTPHEADER,array("Expect: "));


3) Jezeli serwer to cos z litespeed, to formularz wyslany dotrze tylko czesciowo. To co ma pojsc przez $_POST bedzie OK, to co bedzie wyslane przez $_FILES to nie przejdzie

Wlasnie w moim wypadku wystepuje przypadek nr 3. Jak podkreslam wczesniej to dzialalo. Nie wiem co sie stalo ze teraz nie dziala. $result wraca strone bez zadnych bledow. Skrypt uruchamiam w trybie CLI. Sciezki oczywiscie istnieja, pliki tez i maja prawa jak trzeba.

Co do wersji:

cURL support => enabled
cURL Information => 7.21.0
Age => 3
Features
AsynchDNS => No
Debug => No
GSS-Negotiate => Yes
IDN => Yes
IPv6 => Yes
Largefile => Yes
NTLM => Yes
SPNEGO => No
SSL => Yes
SSPI => No
krb4 => No
libz => Yes
CharConv => No
Protocols => dict, file, ftp, ftps, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtsp, scp, sftp, smtp, smtps, telnet, tftp
Host => x86_64-pc-linux-gnu
SSL Version => OpenSSL/0.9.8o
ZLib Version => 1.2.3.4
libSSH Version => libssh2/1.2.6

a PHP to 5.3.3

Co wiec tu jest zle ze do 3) nie wysyla zdjec ?
redeemer
1. Czy w cookies jest sesja? Może wygasła.
2. Sprawdź curl_error()
3. Czy "ręcznie" formularz przechodzi poprawnie?
moonraker
1) Ja to robie tak, kasuje plik cookies.txt, uruchamiam skrypt on robi co trzeba i sie konczy. Proces w petli powtarza sie 10 razy i koncy finalnie. Sesja jest a skrypt nie trwa dluzej niz 5min.

2) Tablica jest pusta

3) Jasne.
redeemer
Może CURLOPT_VERBOSE coś Ci podpowie.
moonraker
Srednio pomaga sad.gif


* About to connect() to www.xxx.pl port 80 (#0)
* Trying x.x.x.x... * connected
* Connected to www.xxx.pl (x.x.x.x) port 80 (#0)
> POST /form/ HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1
Host: www.xxx.pl
Accept: */*
Referer: http://www.xxx.pl/form/
Cookie: PHPSESSID=dca313092d0d21a6cf86cdb53681cb91
Content-Length: 78910
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------e166ecc91b51

* Done waiting for 100-continue
< HTTP/1.1 200 OK
< Transfer-Encoding: chunked
< Date: Thu, 27 Oct 2011 22:16:10 GMT
< Server: LiteSpeed
< Connection: Keep-Alive
< Keep-Alive: timeout=5, max=100
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Content-Type: text/html
<
* Connection #0 to host www.xxx.pl left intact
* Closing connection #0
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Thu, 27 Oct 2011 22:16:10 GMT
Server: LiteSpeed
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html




No i udalo sie.

Ten przyklad co napisalem bez problemu dziala na innych serwerach niz ten z litespeed.

Dla tego, trzeba dodac typ pliku przy nazwie. Np jesli mamy zdjecie to:


  1. $dane['zdjecie1'] = '@/sciezka/do/pliku.jpg;type=image/jpeg';
  2. $dane['zdjecie2'] = '@/sciezka/do/pliku2.jpg;type=image/jpeg';


W PHP 5.3.x to przechodzi. W PHP 5.2.x nie trzeba dodawac typu.
Ten typ dotyczy tez libcurl 7.21.0

Heh....
wNogachSpisz
Używam PEAR:HTTP_REQUEST, a od niedawna HTTP_REQUEST2 (dodali observery).
Te bibliteki same implementują HTTP i pracują z połączeniem na poziomie Socketów,
między innymi dlatego różnice wersji curla czy PHP są im nie straszne..

Szczerze polecam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.