Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как получить имя скачиваемого файла?


Автор: x_byte 11.3.2006, 20:54
Что-то я не пойму... как получить имя файла перед закачкой из урла вида: _http://soft.mail.ru/Download.php?ver=21091 к примеру...
т.е. нужно видимо перехватить редирект (url) на сам файл, но как это сделать, я не могу разобраться!
Желательно с использованием WinInet...

Автор: FRAGNATIC 11.3.2006, 21:37
новерное дождатся ответа скрипта что по адресу _http://soft.mail.ru/Download.php?ver=21091
потому что зачастую работа его выглядит так
Код

function download()
{
    global $prefix,$dbi,$pagetitle;
    $res = sql_query('SELECT file_url FROM '.$prefix.'_mp3 WHERE id="'.intval($_GET['id']).'"', $dbi);
    if (mysql_num_rows($res))
    {
        $file = mysql_result($res,0,0);
        sql_query('UPDATE '.$prefix.'_mp3 SET dl_count=dl_count+1 WHERE id="'.intval($_GET['id']).'"', $dbi);

        header('Location: '.$file);
    }
}

header('Location: '.$file);
вот что тебя перекидывает =)

Автор: x_byte 11.3.2006, 22:17
я это и имею ввиду... header('Location: ... меня редиректит на определённый урл (файла), так вот не понятно как получить этот самый урл...

пробовал вытащить из заголовков, не вышло:
Код

procedure TForm1.Button2Click(Sender: TObject);
const
  DataBufLen = 1024;
var
  buffer, Header, FileUrl: String;
  hInet, hURL: HINTERNET;
  size, index: DWORD;

  bHeaderRead: Boolean;
  HeaderBuf: Array [0..DataBufLen-1] of char;
  dwHeaderBufLength: DWord;
  dwHeaderReserved: DWord;
  aHeader: String;
begin
  hInet:=InternetOpen(nil,
    INTERNET_OPEN_TYPE_PRECONFIG,
    nil,
    nil,
    0);

  Header:='Accept: */*';
  FileUrl:='http://soft.mail.ru/Download.php?ver=21091';
  hURL:=InternetOpenURL(hInet,
    PChar(FileUrl),
    pchar(Header),
    StrLen(pchar(Header)),
    INTERNET_FLAG_RELOAD,
    0);
    dwHeaderReserved:=0;
    dwHeaderBufLength:=SizeOf(HeaderBuf);
    repeat
      bHeaderRead:=HttpQueryInfo(hURL, HTTP_QUERY_RAW_HEADERS_CRLF, @HeaderBuf, dwHeaderBufLength, dwHeaderReserved);
      aHeader:=aHeader+HeaderBuf;
    until (bHeaderRead = false) or (dwHeaderReserved = 0);
    Memo1.Text:=aHeader;
    InternetCloseHandle(hInet);
    InternetCloseHandle(hURL);
end;

Выдаёт:
HTTP/1.1 200 OK
Date: Sat, 11 Mar 2006 19:16:58 GMT
Server: Apache/1.3.33 (Unix)
Cache-Control: max-age=3600
Expires: Sat, 11 Mar 2006 20:16:58 GMT
Last-Modified: Wed, 01 Mar 2006 06:41:09 GMT
ETag: "c2984d-a7b14b-44054205"
Accept-Ranges: bytes
Content-Length: 10989899
Content-Type: application/octet-stream
Connection: Keep-Alive

Автор: x_byte 11.3.2006, 22:42
Всё... разобрался!
Надо было просто добавить параметрам InternetOpenUrl - INTERNET_FLAG_NO_AUTO_REDIRECT
Код

procedure TForm1.Button2Click(Sender: TObject);
const
  DataBufLen = 1024;
var
  buffer, Header, FileUrl: String;
  hInet, hURL: HINTERNET;
  size, index: DWORD;

  bHeaderRead: Boolean;
  HeaderBuf: Array [0..DataBufLen-1] of char;
  dwHeaderBufLength: DWord;
  dwHeaderReserved: DWord;
  aHeader: String;
begin
  hInet:=InternetOpen(nil,
    INTERNET_OPEN_TYPE_PRECONFIG,
    nil,
    nil,
    0);

  Header:='Accept: */*';
  FileUrl:='http://soft.mail.ru/Download.php?ver=21091';
  hURL:=InternetOpenURL(hInet,
    PChar(FileUrl),
    pchar(Header),
    StrLen(pchar(Header)),
    INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_AUTO_REDIRECT, //ТУТ
    0);
    dwHeaderReserved:=0;
    dwHeaderBufLength:=SizeOf(HeaderBuf);
    repeat
      bHeaderRead:=HttpQueryInfo(hURL, HTTP_QUERY_RAW_HEADERS_CRLF, @HeaderBuf, dwHeaderBufLength, dwHeaderReserved);
      aHeader:=aHeader+HeaderBuf;
    until (bHeaderRead = false) or (dwHeaderReserved = 0);
    Memo1.Text:=aHeader;
    InternetCloseHandle(hInet);
    InternetCloseHandle(hURL);
end;

HTTP/1.1 302 Moved Temporarily
Server: Apache/1.3.27 (Unix) DAV/1.0.3 mod_jk/1.2.4 mod_ruby/1.0.7 Ruby/1.6.8 mod_mrim/0.17
Date: Sat, 11 Mar 2006 19:38:45 GMT
Content-Type: text/html
Location: _http://www.semonitor.ru/semonitor-rus.exe
P3P: policyref="/w3c/p3p.xml", CP="UNI"
x-powered-by: PHP/4.3.10
Set-Cookie: _TEST_=1; path=/; domain=.mail.ru
set-cookie: _TEST_=1; path=/; domain=.allsoft.ru
set-cookie: _TEST_=1; path=/; domain=.allsoft.kz
set-cookie: _TEST_=1; path=/; domain=.allsoft.by
set-cookie: _TEST_=1; path=/; domain=.allsoft.uz
set-cookie: _TEST_=1; path=/; domain=.allsoft.com.ua
Connection: Close

Автор: FRAGNATIC 12.3.2006, 00:06
x_byte,
Молодец.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)