Как скачать файл из интернета по ссылке?

Модератор: Модераторы

Ответить
Аватара пользователя
alek111
новенький
Сообщения: 20
Зарегистрирован: 20.06.2006 16:17:50

Как скачать файл из интернета по ссылке?

Сообщение alek111 »

Подскажите как максимально просто скачать файл из интернета.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Пример скачивания файла с помощью Synapse:

http://lazarus.su/other/skachivaem-fayl-po-ssyilke.html
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

laxi писал(а):Сылка почему то не открывается

ИМХО, сайт умер :(
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Как раз на днях мне понадобилось сделать такое.
Немного порывшись тут и там, + метод научного тыка и родилось (посредством 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));


Вот, как-то так.
У меня всё работает.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

sign
Вряд ли Ваш способ можно назвать простым. :D

Код: Выделить всё

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.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

А что там сложного?
Мне нужно залогиниться на сайте, программно.
Скачать открытую страницу.
Вытащить с этой страницы имя документа, поскольку оно (имя) формируется программно.
По данному имени закачать - не страницу из интернета, а документ - *.xls
Документ считывается в поток, поток записывается в файл на диске.

Т.е., если скачивать документ (не страничку) расположенный по заранее известному адресу, то всё очень просто.
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Сообщение Little_Roo »

Вот нашел в загашнике пример с (видимо уже умершего) lazarus.su
05_GetFile.rar
(11.23 КБ) 2058 скачиваний
docent83
незнакомец
Сообщения: 1
Зарегистрирован: 22.05.2017 22:36:50

Сообщение docent83 »

У меня другой вопрос, как остановить загрузку большого файла?
Не нашел ничего похожего в TFPHttpClient. Что-то типа метода Interrupt или Close;
Есть protected метод DisconnectFromServer у родителя, но если его перекрыть и вызвать в потомке, то возникает ошибка.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

docent83, а код/текст ошибки?
Возможно, нет смысла его перекрывать, а стоит создать метод его юзающий.
Ответить