Как скачать файл из интернета по ссылке?
Модератор: Модераторы
Как скачать файл из интернета по ссылке?
Подскажите как максимально просто скачать файл из интернета.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
laxi писал(а):Сылка почему то не открывается
ИМХО, сайт умер
Как раз на днях мне понадобилось сделать такое.
Немного порывшись тут и там, + метод научного тыка и родилось (посредством Indy):
Кидаем на форму - Http: TIdHTTP. Добавляем - TIdSSLIOHandlerSocketOpenSSL.
В свойстве IOHandler нашего Http, указываем - TIdSSLIOHandlerSocketOpenSSL.
Для куков кидаем - CM: TIdCookieManager и прописываем его в свойстве CookieManager нашего Http.
И для полного счастья кидаем на эту же форму - TIdAntiFreeze.
Установил
Добавил:
Поскольку мне нужно входить на нужный мне сайт через логин - пароль, то посредством огненной лисы и его средства HTTPFox, вытащил всё нужное и по выдерганному написал:
Затем включил в список Data всё нужное для авторизации на сайте
Подключаюсь
Затем с считанной страницы сайта ищу адрес нужного мне файла по его названию
Ну и, собственно ответ на ваш вопрос - чтение самого файла
Вот, как-то так.
У меня всё работает.
Немного порывшись тут и там, + метод научного тыка и родилось (посредством Indy):
Кидаем на форму - Http: TIdHTTP. Добавляем - TIdSSLIOHandlerSocketOpenSSL.
В свойстве IOHandler нашего Http, указываем - TIdSSLIOHandlerSocketOpenSSL.
Для куков кидаем - CM: TIdCookieManager и прописываем его в свойстве CookieManager нашего Http.
И для полного счастья кидаем на эту же форму - TIdAntiFreeze.
Установил
Код: Выделить всё
Http.AllowCookies := True;
Http.CookieManager := CM;
Http.HandleRedirects := True;
Добавил:
Код: Выделить всё
Data := TStringList.Create;
Stream := TMemoryStream.Create;
dump2 := TMemoryStream.Create;
Поскольку мне нужно входить на нужный мне сайт через логин - пароль, то посредством огненной лисы и его средства HTTPFox, вытащил всё нужное и по выдерганному написал:
Код: Выделить всё
Http.Request.Host := '...; // Подставляем реальный хост
Http.Request.UserAgent := 'Mozilla/5.0 (Windows NT 5.1; rv:28.0) Gecko/20100101 Firefox/28.0';
Http.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Http.Request.AcceptLanguage := 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
Http.Request.AcceptEncoding := 'gzip, deflate';
Http.Request.AcceptCharSet := 'windows-1251,utf-8;q=0.7,*;q=0.7';
Http.Request.Referer := 'http:...'; // Подставляем реальный адрес
Http.Request.Connection := 'keep-alive';
Http.Request.ContentType := 'application/x-www-form-urlencoded';
Затем включил в список Data всё нужное для авторизации на сайте
Код: Выделить всё
Data.Add('тут логин');
Data.Add('А вот тут пароль');
Data.Add('1'); // А тут скрытые данные требуемые для регистрации
Data.Add('1111'); // Ещё одни скрытые данные требуемые для регистрацииПодключаюсь
Код: Выделить всё
Http.Post('http://.../login_post.asp', Data, dump2);
dump2.Seek(0, soFromBeginning);
Data.LoadFromStream(dump2); // передаем данные дампа в стринглист для анализа
SSID := SessionID; // SSID: string; Написал функцию SessionID для вытаскивания из прочитанных данных номера сессии. Для формирования адреса файла с сайта - в адресе стоит номер сессии.
Затем с считанной страницы сайта ищу адрес нужного мне файла по его названию
Код: Выделить всё
S := FindFileName('Бланк заказа продукции');Ну и, собственно ответ на ваш вопрос - чтение самого файла
Код: Выделить всё
S := Format('http://.../download5.asp?sessionid=%s&filename=%s', [SSID, S]);
Stream.Clear;
Http.Get(S, Stream);
S := Format('D:\...\Заказы\%s Бланк заказа продукции.xls', [DateToStr(Now, '')]);
Stream.SaveToFile(Utf8ToAnsi(S));
Вот, как-то так.
У меня всё работает.
sign
Вряд ли Ваш способ можно назвать простым.
Вряд ли Ваш способ можно назвать простым.
Код: Выделить всё
program httpget;
{$mode objfpc}{$H+}
uses
SysUtils, Classes, fphttpclient;
var
w: TFPHTTPClient;
begin
w:=TFPHTTPClient.Create(Nil);
w.Get('http://www.freepascal.ru','./file.html');
w.Free;
end.А что там сложного?
Мне нужно залогиниться на сайте, программно.
Скачать открытую страницу.
Вытащить с этой страницы имя документа, поскольку оно (имя) формируется программно.
По данному имени закачать - не страницу из интернета, а документ - *.xls
Документ считывается в поток, поток записывается в файл на диске.
Т.е., если скачивать документ (не страничку) расположенный по заранее известному адресу, то всё очень просто.
Мне нужно залогиниться на сайте, программно.
Скачать открытую страницу.
Вытащить с этой страницы имя документа, поскольку оно (имя) формируется программно.
По данному имени закачать - не страницу из интернета, а документ - *.xls
Документ считывается в поток, поток записывается в файл на диске.
Т.е., если скачивать документ (не страничку) расположенный по заранее известному адресу, то всё очень просто.
- Little_Roo
- энтузиаст
- Сообщения: 639
- Зарегистрирован: 27.02.2009 18:56:36
- Откуда: Санкт-Петербург
Вот нашел в загашнике пример с (видимо уже умершего) lazarus.su
У меня другой вопрос, как остановить загрузку большого файла?
Не нашел ничего похожего в TFPHttpClient. Что-то типа метода Interrupt или Close;
Есть protected метод DisconnectFromServer у родителя, но если его перекрыть и вызвать в потомке, то возникает ошибка.
Не нашел ничего похожего в TFPHttpClient. Что-то типа метода Interrupt или Close;
Есть protected метод DisconnectFromServer у родителя, но если его перекрыть и вызвать в потомке, то возникает ошибка.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
docent83, а код/текст ошибки?
Возможно, нет смысла его перекрывать, а стоит создать метод его юзающий.
Возможно, нет смысла его перекрывать, а стоит создать метод его юзающий.
