Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить Location из URL? [D7, WinXP]


Страницы:   1 2

ShuRiK_0481 ©   (2005-08-25 13:46:00) 

Здравствуйте Уважаемые Мастера Delphi!
Подскажите, пожалуйста, чайнику как получить Location зная URL?
Мне необходимо написать небольшую функцию, которая будет принимать в качестве параметра URL и возвращать имя файла.
Если можно реальным примером.

Заранее большое спасибо.

P.S.
Парсинг не предлагать. Из ссылки типа http://mysite.net/c.php?act=download?file_id=27635мне нужно получить не c.php, а имя загружаемого файла, например file.zip
Надеюсь доходчиво сформулировал. :)


Slym   (2005-08-31 06:05:00) [1]

1. Установи себе Reget
2. Запусти в нем несколько разных закачек
3. Анализируй диалог с сервером


ShuRiK_0481   (2005-08-30 17:10:00) [2]

Я не получал ответа сервера, поэтому написать его тут не могу.
Я искал имя файла через свойства компонентов, которые сами прекрасно парсят ответ сервера. Но просто я не знал и не мог найти как правильно пользоваться этими компонентами. Например я сам методом "тыка" допёр до того, что на прямые ссылки сервер имя файла не возвращает, а возвращает его в Content-Location при ответе сервера, например, "HTTP/1.0 302 Moved Temporarily". Поэтому прямые ссылки, на которые сервер отвечает "HTTP/1.0 200 OK", приходится парсить.


Piter   (2005-08-30 13:18:00) [3]

ShuRiK_0481   (30.08.05 11:08) [22]
тонну примеров по скачиванию файлов разными способами различными компонентами, пытался доработать их, чтобы они выдавали мне имя файла


гонишь. Если бы ты скачивал файл - то увидел бы что возвращается, а оттуда с легкостью вытащил бы имя файла, а не тратил бы "НЕДЕЛИ".

Напиши тут, что возвращается по запросу к твоему скрипту, а?


Alexander Panov   (2005-08-30 11:21:00) [4]

ShuRiK_0481   (30.08.05 11:08) [22]
ж)


ShuRiK_0481   (2005-08-30 11:08:00) [5]

2 Piter:
Я искал ответ на свой вопрос далеко не пару часов. Ушла почти неделя. Я уже переЯndexил, переGooglил и переYahooярил пол интернета. Но именно как получить этот самый Content-Location не нашел ни одного примерчика. Находил тонну примеров по скачиванию файлов разными способами различными компонентами, пытался доработать их, чтобы они выдавали мне имя файла, но ничего не получалось. По нахождению имени файла нашел две тонны примеров парсинга URL-а, но они мне не подходили.
Моя проблема в том, что я не теоретик. Я намного быстрее вникаю в ту или иную тему на живых примерах. Килобайты теории у меня в голове не откладываются. :(((
Я не такой тип людей, который программирует методом Copy - Paste. Примеры, которые приводят добрые люди я анализирую и вникаю как они работают, и в итоге на основе данного примера я пишу свою процедуру, которая будет отвечать моим требованиям.
Код, предоставленный Уважаемым C0de_eviL-ом, я тоже не просто скопировал в свой проэкт. Я просто взял его за основу, как справочное пособие, и все-равно писал свою функцию.


Piter   (2005-08-29 12:14:00) [6]

ShuRiK_0481   (29.08.05 11:23) [20]
А кто ж интересно достоен? Тот, кто и так все знает и просто поболтать сюда зашел?


который задает грамотный вопрос. Который сам паручасов ищет ответ на свой вопрос и приходит, когда уже совсем не знает чего делать. Все расписывает.
Такому приятно помогать. Да и помогать то ему надо - всего одно предложение написать, а дальше он сам.


ShuRiK_0481   (2005-08-29 11:23:00) [7]


> Alexander Panov ©   (26.08.05 14:01)
>1. Бросить на форму TidHTTP из комплекта Indy
>2. Выполнить s := IdHTTP.Get(' http://mysite.net/c.php?act=download?file_id=27635');
>3. Посмотреть s на предмет имени и взять его оттуда.

Согласен с Piter-ом, поддерживает он перенаправление. Get сразу кидается качать файл. IdHTTP.Head то, что нужно.

> Я тоже раньше тратил по часу на написание подробных ответов
> людям, с исходными кодами, разжевывал :)
>
> А потом понял, что они этого недостойны :)))

А кто ж интересно достоен? Тот, кто и так все знает и просто поболтать сюда зашел?


Piter   (2005-08-27 15:34:00) [8]

C0de_eviL   (27.08.05 4:04) [17]

круто :)
Я тоже раньше тратил по часу на написание подробных ответов людям, с исходными кодами, разжевывал :)

А потом понял, что они этого недостойны :)))


ShuRiK_0481   (2005-08-27 11:57:00) [9]

2 C0de_eviL

НАКОНЕЦ-ТО!!! Хоть один понимающий человек нашелся!
Агромный респект!!!

> или просто через свойство idhttp1.Response.Location

Это проще :)

> Плохиш ©   (26.08.05 11:06) [11]
>
> 500 Euro

[смайлик в виде дули]

Тема закрыта.


C0de_eviL   (2005-08-27 04:04:00) [10]

Вот
Надеюсь поможет


var

MSG: String;
RWsaData:  TWsaData;
RSocket:   TSocket;
RSockaddr: Sockaddr_in;

procedure TForm1.FormCreate(Sender: TObject);
begin
 WsaStartup($101,RWsaData);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 WSACleanup;
end;

procedure TForm1.ButtonStartClick(Sender: TObject);

Var

New:String;
 STR: String;
  Buffer : array [0..1024] of char;//

begin

 RSocket:= Socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
 RSockaddr.sin_family:= AF_INET;
 RSockaddr.sin_port:= HTONS(80);//Порт сервера
 RSockaddr.sin_addr.S_addr:= inet_addr('127.0.0.1');//в место 127.0.0.1 надо написать ip адрес сервера с каким будем работать.

  Connect(RSocket,RSockaddr,sizeof(RSockaddr));

MSG:='GET ' + ' http://mysite.net/c.php?act=download?file_id=27635HTTP/1.0'#10#10;//сам запрос гет

Send(RSocket,Pointer(MSG)^,Length(MSG),0);//отправка запроса

Recv(RSocket,Buffer,1024,0); //получаем 302 ответ от сервера и записываем его в buffer
//теперь достанем Location =)

 New := String(Buffer);//Сдесь у нас Buffer он типа char его мы превращаем в тип String и,присваиваем переменной New типа String

Memo1.Lines.Add(New);//Теперь весь ответ показываем в memo1
{
В ответе будет похоже на это. из поля Location можно реально выдрать то что нам нужно

HTTP/1.0 302 Moved Temporarily
Connection: close
Content-Type: text/html
Location: file.zip

}
 Str := copy(New,87,8);//сдесь мы копируем нужный текст длиной 8 символов file.zip начиная с 87 го символа и,присваиваем его в Str

end;

end.


незабуть добавить в Uses  модуль Winsock

есть ещё один вариант выдрать данные из location используя idhttp это так можно сделать привиду кусок исходника

Var
...
....
AData : TStringStream;
..
begin
AData := TStringStream.Create('');
try
idhttp1.Post(' http://www.ru',request,Adata);
except on E:Exception do
end;
request.Free;
try
 Code := AData.DataString;
               AData.Free;
Memo2.Lines.Text := Code;
    STR := Memo2.Lines[94];//нужная строка
   K := Copy(STR,53,21);//от куда до куда копируем
Except
end;


или просто через свойство idhttp1.Response.Location


Piter   (2005-08-26 14:44:00) [11]

Alexander Panov ©   (26.08.05 14:01) [15]

ты уверен, что idHHTP перенаправление не поддерживает? А то он ведь прозрачно может начать грузить нужный файл...


Alexander Panov   (2005-08-26 14:01:00) [12]

ShuRiK_0481   (26.08.05 11:00) [10]
не _парсинг_ данного URL. Ежу понятно, что там никакого file.zip нету! Я НЕ СЛЕПОЙ! Мне именно надо кусочек кода, который будет получать от сервера именно Content-Location или Disposition (этого я точно не знаю).


Ну так что проще всего?
1. Бросить на форму TidHTTP из комплекта Indy
2. Выполнить s := IdHTTP.Get(' http://mysite.net/c.php?act=download?file_id=27635');
3. Посмотреть s на предмет имени и взять его оттуда.

Далее выкидываем TIdHTTP и создаем его в RunTime.
Всё.


Piter   (2005-08-26 13:59:00) [13]

ShuRiK_0481   (26.08.05 11:00) [10]

а ты просто обратись к серверу, получи ответ, увидешь из чего ответ состоит, тут и догадаешься как получить имя файла


Плохиш   (2005-08-26 11:12:00) [14]

Кстати, "Content-Disposition: filename=..." есть простое предложение веб-сервера по названию для сохранения на диске последовательности байтов, переданной в результате запрса.


Slym   (2005-08-26 11:07:00) [15]

HEAD c.php HTTP/1.1
Host: mysite.net
Content-Length: 26

act=download&file_id=27635


Плохиш   (2005-08-26 11:06:00) [16]


> Мне именно надо кусочек кода

500 Euro


ShuRiK_0481   (2005-08-26 11:00:00) [17]


> Alexander Panov ©   (25.08.05 14:05) [1]
> Этот URL не содержит имени файла.


> Digitman ©   (25.08.05 17:19) [2]
> ну и где ты в этой URL-строке увидел "file.zip" ?


> Anatoly Podgoretsky ©   (25.08.05 21:25) [4]
> Например извлечь, то чего нет

Уважаемые! Я же вроде ясно выразился, мне нужен не _ парсинг_ данного URL. Ежу понятно, что там никакого file.zip нету! Я НЕ СЛЕПОЙ! Мне именно надо кусочек кода, который будет получать от сервераименно Content-Location или Disposition(этого я точно не знаю).
В протоколе я полный баран! Изучать его нет ни времени ни нужды (в дальнейшем он мне не понадобится). В моей программе работы с интернетом всего строк 15. Ну не тратить же месяц на вникание в RFC2616, чтобы написать маленькую ф-цию, которая будет получать в качестве параметра URL и выдавать имя запрашиваемого файла.


Slym   (2005-08-26 06:49:00) [18]

Зачастую HTTP 302 - редирект :)


Slym   (2005-08-26 04:12:00) [19]

Поле ответа
Content-Disposition: filename=file.zip


Piter   (2005-08-26 00:35:00) [20]

Alexander Panov ©   (25.08.05 23:33) [6]

:))) Ну я думаю доменное имя MySite он как пример привел :)))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо