Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Забрать список из инета


Автор: -=::BlackCat::=- 5.5.2004, 13:46
как запросить файл лежащий в инете без каких либо дополнительних заморочек. Например мне надо загрузить файл по адрессу http://www.moe.nm.ru/spisok.db в TListBox моей проги, как я понимаю команда ListBox.Items.LoadFromFile('http://www.moe.nm.ru/spisok.db'); не чего не даст. как можно ещё?

Автор: -=::BlackCat::=- 5.5.2004, 14:00
Насчот заморочек я погоречился, они будут так или иначе, просьба подсказать которым способом попроще, да вот ещё что, юзер данный TListBox видеть не будет и не должен, потому и не должен узнать что в файле, тобиш идея типа скачивать и сохранять отпадает =\

Автор: z-END 5.5.2004, 16:15
ИМХО как ни крути а скачивать тебе ее придется, по другому с иНета данные не получить, используй какой-нить FTP client для этого

Автор: -=::BlackCat::=- 5.5.2004, 18:33
=(

может ещё каким вариантом кто абрадует?

Автор: Alex 5.5.2004, 20:56
А чем тебя предложенный не устраивает?

Автор: -=::BlackCat::=- 5.5.2004, 21:25
юзер не должен иметь шанса, узнать что лежит в файле

Автор: Alex 5.5.2004, 21:35
Вот распостранненая функци скачивания файла:
Код
function DownloadFile(const Url: string): string;
var
 NetHandle: HINTERNET;
 UrlHandle: HINTERNET;
 Buffer: array[0..1024] of char;
 BytesRead: cardinal;
begin
 Result := '';
 NetHandle := InternetOpen('Delphi 5.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

 if Assigned(NetHandle) then
   begin

     UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);

     if Assigned(UrlHandle) then
{ UrlHandle правильный? Начинаем загрузку }
       begin
         FillChar(Buffer, SizeOf(Buffer), 0);
         repeat
           Result := Result + Buffer;
           FillChar(Buffer, SizeOf(Buffer), 0);
           InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
         until BytesRead = 0;
         InternetCloseHandle(UrlHandle);
       end
     else
       begin
{ UrlHandle неправильный. Генерируем исключительную ситуацию. }
         raise Exception.CreateFmt('Cannot open URL %s', [Url]);
       end;

     InternetCloseHandle(NetHandle);
   end
 else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
   raise Exception.Create('Unable to initialize Wininet');
end;


Но учти, это эта функция закончиться неудачей, если доступ осуществляется через ISA с заблокированным анонимным доступом.

Автор: z-END 5.5.2004, 22:00
-=::BlackCat::=-
а как юзер узнает содержимое файла?! откуда он вообще узнает про него?!
ну если тебя это очень пугает есть еще вариант, если это твой сайт (или доступ к нему имеешьsmile.gif
Суть такая: на сервак закидываешь скрипт, который по http отсылает тебе энтот файл, а у себя в проге его обрабатываешь... тогда этот файл вообще нигде не будет записан... (ну только если в кэшеsmile.gif

Автор: -=::BlackCat::=- 5.5.2004, 22:15
alex-co
а что он результатом выдавать будет??? там написано стринг, но ведь это не совсем то, или меня глючит?

nJIaKca.spb
в файле будет ИП для конекта проги, не очень охота каждому свой ип светить.
Добавлено @ 22:18
у каждой боязьни есть свои измерения, в большенстве прог ты можеш поставить уровень безопасности, вот точно так и я выбрал для себя, что нужно остановится на данном варианте, я понимаю что "против лома нет приёма" если человеку приспичет то он может и мою прогу разобрат по спичкам, но я думаю что это уже перебор

Автор: z-END 5.5.2004, 22:38
-=::BlackCat::=- т.е. ты хочешь спрятать IP адрес к которому подключается твоя прога? если так то это и яйца выеденного не сотит т.к. спрятать это нереально если стоит firewall то он кроме IP еще и опишет все действия которые ты делал из своей проги в иНете... так что

Автор: Alex 5.5.2004, 22:54
-=::BlackCat::=- Если ты хочешь скачать текстовый файл, то результатом функции будет его содержимое.

Автор: -=::BlackCat::=- 5.5.2004, 22:54
FIREWALL меня не волнует

Автор: z-END 10.5.2004, 12:00
Если я тебя правильно понял то тебе нужно получить IP адрес твоего сервера в ListBox, вот код который это реализует:

HT: TIdHTTP; {стандартный индийский компонент}

Проверял на localhost, так что для инета наверное логичней не в обработчик
нажатия кнопки а в отдельный поток выделить
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
HT.Connect;
HT.Get ('http://твой-сайт/IP.php');
ListBox1.items.add (HT.Response.Pragma);
end;

Собственно файл IP.php
Код

<?php header("Pragma: ".$_ENV["SERVER_ADDR"]); ?>

Данный скрипт вставляет в заголовок Pragma - адрес сервера где находится сам скрипт, если тебе нужен какой-то фиксированный IP-адрес то тогда перепеши скрипт в такой форме:
Код

<?php header("Pragma:  XXX.XXX.XXX.XXX"); ?>
(где XXX - нужный тебе IP адрес )
Одна оговорочка:
на сервере, должна быть поддержка PHP (чего у халявных хостеров ал-ля народ нет) wink.gif

Автор: RA 10.5.2004, 19:41
Uses UrlMon;

Код
UrlDownloadToFile(nil, Pchar('http://file.ru/File.exe'), pchar( 'c:\MyFile' ), 0, nil);

Автор: dm9 11.5.2004, 20:05
Пример alex-co работает примерно так: Memo1.Text := DownloadFile ('http://www.xxx.xx/xxx.xx')

Вот ещё: http://forum.vingrad.ru/index.php?showtopic=21250

Автор: -=::BlackCat::=- 11.5.2004, 20:33
Всем большое спасибо, задача была решена способом предложеным nJIaKca.spb, спомощью PHP script`а.

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