PDA

Ver la Versión Completa : Descargar un fichero


sagitarius
12-02-2008, 13:58:02
Buenas.

Les cuento, tengo varios enlaces del tipo

http://www.peliculasyonkis.com/descargar.php?id=934

y rapidamente se lanza una ventana para descargar el fichero, quisiera saber si es posible interactuar con esa ventana desde delphi (para obtener el nombre del fichero y el servidor).

Es decir al presionar sobre el enlace aparace la tipica ventana para descargar el fichero y deseo obtener el nombre y servidor del fichero para poderlo descargar desde mi aplicacion delphi.

Gracias

dec
12-02-2008, 15:06:13
Hola,

Se me ocurre que para descargar el archivo no necesitas sino seguir el enlace, es decir, no me queda muy claro si sabes cómo descargar un archivo usando Delphi, puesto que el enlace que has puesto redirige a dicho archivo, y, por tanto, no deberías tener problemas en descargarlo.

A lo dicho se suma que el nombre del archivo es del tipo "2983202.divx", así que conocerlo no sé yo si te servirá de mucho o qué. Y, por otro lado, está el hecho de que puedes descargar el archivo y guardarlo con el nombre que tú quieras. Pero, ya digo, no sé si van por aquí los tiros o no.

En todo caso me he entretenido un rato y he preparado una función (no muy buena, seguramente) de modo que puedes obtener las cabeceras HTTP partiendo de una determinada URL, de tal modo que, mejor o peor (no estoy muy contento con el resultado, la verdad) puedes conseguir exactamente los datos que dices, al menos en este caso.

Ahí va la función:


uses
WinInet;

function GetHttpHeaders(url: string): string;
var
agent: string;
flags: cardinal;
len, dummy: dword;
hInet, hUrl: hInternet;
headers: array [0..MAX_PATH] of char;
begin
dummy := 0;
len := sizeof(headers);
agent := 'Mozilla/3.0 (compatible; )';
flags := INTERNET_OPEN_TYPE_PRECONFIG;
hInet := InternetOpen(PChar(agent), flags, nil, nil, 0);
if (hInet <> nil) then begin
flags := INTERNET_FLAG_RELOAD;
hUrl := InternetOpenUrl(hInet, PChar(url), nil, 0, flags, 0);
if (hUrl <> nil) then begin
flags := HTTP_QUERY_RAW_HEADERS_CRLF or
HTTP_QUERY_FLAG_REQUEST_HEADERS;
if not HttpQueryInfo(hUrl, flags, @headers, len, dummy) then
begin
result := EmptyStr
end else begin
result := headers;
end;
InternetCloseHandle(hUrl);
end;
InternetCloseHandle(hInet);
end else begin
result := EmptyStr;
end;
end;


Lo que te retorna es una cadena de caracteres que contiene varios "campos" separados por "retornos de carro". Como podrás comprobar, entre esos campos (que corresponden a cabeceras HTTP) están el "host" y el nombre del archivo en cuestión. Espero que te sea de alguna ayuda.

sagitarius
13-02-2008, 03:35:33
Gracias dec.

Googleando he localizado otro codigo mediante componentes indy mas concretamente con el componente TIdHttp.



procedure TForm1.Button2Click(Sender: TObject);
begin
IdHTTP1.HandleRedirects:=true;
IdHTTP1.Head(ComBobox1.Items.Strings[Combobox1.itemIndex]);
ListBox1.Items.Assign(idhttp1.Response.RawHeaders);
if IdHTTP1.ResponseCode=404 then
ListBox1.Items.Add('A File nem letezik')
else
begin
if IdHTTP1.ResponseCode=200 then
ListBox1.Items.Add('A File letezik')
else
ListBox1.Items.Add('Hiba');
ListBox1.Items.Add('*************************************');
ListBox1.Items.Add('Visszateresi kod szoveges :'+IdHTTP1.ResponseText);
ListBox1.Items.Add('Visszateresi kod ertek :'+inttostr(IdHTTP1.Responsecode));
ListBox1.Items.Add('host:'+IdHTTP1.Request.Host+' Filenev :'+IdHTTP1.Request.URL);
if idhttp1.Response.RawHeaders.IndexOfName('Last-Modified') > -1 then
ListBox1.Items.Add('Utolso modositas datum :'+idhttp1.Response.RawHeaders.Values['Last-Modified'])
else
ListBox1.Items.Add('Nincs info az utolso modositasrol');
if idhttp1.Response.RawHeaders.IndexOfName('Date') > -1 then
ListBox1.Items.Add('File datum :'+idhttp1.Response.RawHeaders.Values['Date'])
else
ListBox1.Items.Add('Nincs info a file datumarol');
if idhttp1.Response.RawHeaders.IndexOfName('Content-length') > -1 then
ListBox1.Items.Add('File meret byte :'+idhttp1.Response.RawHeaders.Values['Content-length'])
else
ListBox1.Items.Add('Nincs info a file mereterol');
end;
end;