Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Как получить Location из URL?   Найти похожие ветки 

 
ShuRiK_0481   (2005-08-25 13:46) [0]

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

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

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


 
Alexander Panov ©   (2005-08-25 14:05) [1]

Этот URL не содержит имени файла.


 
Digitman ©   (2005-08-25 17:19) [2]


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


ну и где ты в этой URL-строке увидел "file.zip" ?


 
Piter ©   (2005-08-25 19:05) [3]

Да ладно, господа. Совсем вы уже навык телепатии растеряли, что же вы.

ShuRiK_0481, итак, я думаю тебе нужно почитать про протокол HTTP, а также про переадресацию. Обратиться к скрипту, получить имя файла переадресованного, оттуда уже извлечь чего надо, чего не надо


 
Anatoly Podgoretsky ©   (2005-08-25 21:25) [4]

Например извлечь, то чего нет


 
batman   (2005-08-25 23:07) [5]

Другими словами человеку требуется обработать скрипт и вернуть имя файла, на который ссылается скрипт программе...


 
Alexander Panov ©   (2005-08-25 23:33) [6]

batman   (25.08.05 23:07) [5]
Другими словами человеку требуется обработать скрипт и вернуть имя файла, на который ссылается скрипт программе...


А ты зайди по его ссылке - там нет никакого файла.


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

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

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


 
Slym ©   (2005-08-26 04:12) [8]

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


 
Slym ©   (2005-08-26 06:49) [9]

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


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


> 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 и выдавать имя запрашиваемого файла.


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


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

500 Euro


 
Slym ©   (2005-08-26 11:07) [12]

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

act=download&file_id=27635


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

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


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

ShuRiK_0481   (26.08.05 11:00) [10]

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


 
Alexander Panov ©   (2005-08-26 14:01) [15]

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 14:44) [16]

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

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


 
C0de_eviL   (2005-08-27 04:04) [17]

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


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=27635 HTTP/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


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

2 C0de_eviL

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

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

Это проще :)

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

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

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


 
Piter ©   (2005-08-27 15:34) [19]

C0de_eviL   (27.08.05 4:04) [17]

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

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


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


> 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-29 12:14) [21]

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


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


 
ShuRiK_0481   (2005-08-30 11:08) [22]

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


 
Alexander Panov ©   (2005-08-30 11:21) [23]

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


 
Piter ©   (2005-08-30 13:18) [24]

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


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

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


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

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


 
Slym ©   (2005-08-31 06:05) [26]

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



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.043 c
14-1132394609
Adil
2005-11-19 13:03
2005.12.11
BC++ 5


11-1113410359
hotes
2005-04-13 20:39
2005.12.11
Динамическое меню


1-1131684367
Er
2005-11-11 07:46
2005.12.11
Выделение компонентов


1-1131087797
SarDoX
2005-11-04 10:03
2005.12.11
Составитель расписаний(автоматический)


2-1132404304
начиннающий
2005-11-19 15:45
2005.12.11
Filter





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский