[WinInet.dll] Jak znalezc nazwe pliku sciagnietego z serwera

0

Jak pobrać nazwę pliku pobieranego za pomocą WinInet? Robię tak:

HINTERNET hInt, hURL;
hInt=InternetOpen("Pobierarka", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
hURL=InternetOpenUrl(hInt, adres.c_str(), 0, 0, 0, 0);

Nazwę pliku niestety nie zawsze można wyciągnąć z URL...

Domyślam się, że trzeba zastosować HttpQueryInfo, tylko z jakimi argumentami?

0

albo przekierowanie i wtedy w naglowku

Location: ..... i tu sciezka do pliku w stylu http://..../bla.zip

albo plik generowany np. przez php i nazwa jako zalacznik w naglowku

Content-Disposition: attachment; filename=bla.zip

0

Ok, domyślam się... Ale jak to wyciągnąć za pomocą powyższej biblioteki?

0

Parametry podanej przez Ciebie funkcji moga byc

HTTP_QUERY_LOCATION
HTTP_QUERY_CONTENT_DISPOSITION

albo caly naglowek poprzez HTTP_QUERY_RAW_HEADERS_CRLF i wtedy szukasz tych co podalem czy to wyrazeniami regularnymi czy z listy recznie odpowiednich naglowkow. Dziala na 100% bo sprawdzilem teraz.

0

ugh. pardon. wycialem 1.5 posta za wiele.
skrót ostatnich dwie wypowiedzi, po usunieciu rzucania w siebie rybami:

JaskMar: - nie zbyt zrozumialem.. o jakich 'nagłówkach' cały czas mówisz?
reichel - moze poczytaj co nie co o konstrukcji zapytan/odpowiedzi http i o "nagłówkach HTTP"?

0

Nie działa mi! Pewnie coś żle robię, mój kod (w skróconej wersji):

HINTERNET hInt, hURL;
hInt=InternetOpen("Pobierarka", INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
hURL=InternetOpenUrl(hInt, "http://www.instalki.pl/gry/download/zrecznosciowe/get.php?file=tower", 0, 0, 0, 0);
//++++++++++++++++++++++++
DWORD ind=0, max=1024;
char buf[1024], buf2[1024];
buf[0]=0;
buf2[0]=0;
//++++++++++++++++++++++++
HttpQueryInfoA(hURL, HTTP_QUERY_LOCATION, buf, &max, &ind);
Application->MessageBoxA(buf,"a",0);
ind=0, max=1024;
HttpQueryInfoA(hURL, HTTP_QUERY_CONTENT_DISPOSITION, buf2, &max, &ind);
Application->MessageBoxA(buf2,"a",0);

Za każdym razem MessageBox'y są puste! Więc co jest nie tak?

@Edit: a wpisując HTTP_QUERY_RAW_HEADERS_CRLF daje mi:

HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 2647172
ETag: "4fa96564-484682-91cf552c"
Last-Modified: Fri, 25 May 2007 08:14:44 GMT

czyli o nazwie pliku nic nie ma. A jednak inne programy skąś to wiedzą...

0

odpowiedz jest prosta - tego pliku tam NIE MA.

serwer www.instalki.pl na
GET /gry/download/zrecznosciowe/get.php?file=tower HTTP/1.1
odpowiada:

  HTTP/1.1 302 Found
  Date: Fri, 22 Aug 2008 12:07:10 GMT
  Server: Apache
  X-Powered-By: PHP/4.4.0
  Location: http://ftp.freenet.de/pub/filepilot/windows/spiele/icytower/icytower13_install.exe
  Content-Length: 0
  Connection: close
  Content-Type: text/html
  X-Pad: avoid browser bug

czyli masz bezposredni redirect (http://en.wikipedia.org/wiki/HTTP_302) na http://ftp.freenet.de/pub/filepilot/windows/spiele/icytower/icytower13_install.exe

i stamtad wlasnie powinienes to sciagnac:
serwer: ftp.freenet.de
GET /pub/filepilot/windows/spiele/icytower/icytower13_install.exe HTTP/1.1
odpowiada:

  HTTP/1.1 200 OK
  Date: Fri, 22 Aug 2008 12:05:57 GMT
  Connection: keep-alive
  Content-Type: application/octet-stream
  Content-Length: 2647172
  Last-Modified: Fri, 25 May 2007 08:14:44 GMT
  ETag: "4fa96564-484682-91cf552c"

po czym nastepuje tresc pliku.. zwroc uwage ze tutaj nie ma naglowka location/contentdisposition, jest jedynie podana wielkosc pliku.

a czemu nie wychodzilo Ci pobieranie nazwy? poniewaz wininet.dll w momencie jak poprzez nie wyslales zapytanie, dostalo odpowiedz 302 i za pewne wykonalo wszystko zgodnie z redirectem - czyli naglowki jakie Ty na koncu dostales to byl ten zestaw naglowkow 'dolny' - z Content-Length ale bez Location od redirecta. sprawdz - mozliwe ze przy pomocy HttpQueryInfo mozna uzyskac DOCELOWY URL ZASOBU, ten juz-po-przekierowaniach i wtedy z niego sobie wytniesz nazwe pliku

0
quetzalcoatl napisał(a)

serwer www.instalki.pl na
GET /gry/download/zrecznosciowe/get.php?file=tower HTTP/1.1
odpowiada: ...

Odpowiada? A jak ty go o to pytasz?

(Nie wiem, czy zauważyłeś że edytowałem poprzedniego posta).

0

normalnie.. wyslalem zapytanie http z palca przez telnet i dostalem taka odpowiedz..
zwroc uwage ze te headery ktore dostajesz pasuja idealnie do DRUGIEGO zestawu headerow, po redirectcie. skup sie wiec na dobraniu sie do nazwy-zasobu-po-redirectcie

0

Po redirectcie, czyli po czym? Po przekierowaniu? :/ (Nie śmiać się, że nie mam pojęcia o protokołach internetowych!!!)

0

http://en.wikipedia.org/wiki/URL_redirection zwlaszcza rozdzial Techniques

0

No, czyli przekierowanie. Kodów flag HTTP_QUERY_... jest 78, sprawdziłem wszystkie, i niestety żaden nie dał mi docelowego URL! Może ktoś wie, jak go "wyciągnąć"?

@reichel: mówiłeś, że sprawdzałeś, i Ci działa. Widocznie w jakimś konkretnym przypadku... Jakiego URL używałeś, i której flagi zastosowałeś? Bo mi w wyżej podanym URL nie działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1