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


Автор: PROme 17.1.2004, 11:18
Помогите!
Нужно скачать файл с сервера.
Скорее всего можно по 80-му порту.

Как это реализовать? А то в этом я полный О biggrin.gif

Автор: <Spawn> 17.1.2004, 11:27
с какого сервера? с FTP?

Автор: PILOT 17.1.2004, 12:20
C помощью NMFTP компонента.
Код

NMFTP.Host := 'ftp.microsoft.com';
NMFTP.Port := 21;
NMFTP.Timeout := 5000;
NMFTP.UserID := 'anonymous';
NMFTP.Password := 'aaaaasdas@mail.ru';
try
  NMFTP.Connect;
except
  On E:Exception do
    ShowMessage(E.message);
end;

а далее читать хелп.

СУВ.

Автор: Полудненко Олег 17.1.2004, 13:15
Возможно моё предлжение и неверно, но нельзя ли просто прописать абсолютный путь (там "http://www...") и скопировать как обычный файл?

Автор: PROme 17.1.2004, 21:41
Спасибо всем за ответы!
Я писал что 80-й порт... это вроде http
Хотя мона и по ФТПшнику...
PILOTIK спасибо за пример, но он мне мало что дает... NMFTP... что это за компонента и де она живет?
Ну, ок подконектились, а че дальше? Как файл то скачатьconfused.gif

ЗЫ: конеект по 80 порту все еще интересует (+ там же авторизации не надо, должно быть по проще)

Автор: Pakshin A. S. 17.1.2004, 21:46
Мне тута подкинули текстик, который достаточно просто качает файлы из Интернета:
Цитата

В uses добавить WinInet
CODE 
procedure GetInetFile(const fileURL, FileName: String);
const BufferSize = 32768;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen: DWORD;
f: File;
sAppName: string;
begin

hSession := InternetOpen( PChar(sAppName),
              INTERNET_OPEN_TYPE_PRECONFIG,
              nil, nil, 0);
try
hURL := InternetOpenURL( hSession,
          PChar(fileURL),
          nil,0,0,0);
try
  AssignFile(f, FileName);
  Rewrite(f,1);
  repeat
  InternetReadFile( hURL, @Buffer,SizeOf(Buffer), BufferLen);
  BlockWrite(f, Buffer, BufferLen);
  until BufferLen = 0;

  CloseFile(f);
finally
  InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end;

   
end;

Автор: PROme 17.1.2004, 23:31
Спасибо!
Щас проверим.

Автор: PROme 18.1.2004, 12:54
Ок.
Все пахает хорошо.
Спасибо огромнейшее за помощь!
Но я тут в этом деле слаб... как там можно привезать эту скачку к статус бару? Было бы неплохо.

Автор: Pakshin A. S. 18.1.2004, 21:13
А что надо отобразить в StatusBar'е?

Если речь идёт, скажем о проценте загрузки файла, то это просто:
1) Получи размер файла в интернете (это где-то на форуме уже обсуждалось)
2) После BlockWrite() можно вставить что-то вроде этого:
Код

Pr:=Round(FileSize(f) * 100 / FileSizeF);

, где Pr - процент, FileSizeF - размер скачиваемого файла.

Должно работать...

Автор: PROme 19.1.2004, 16:16
Цитата
1) Получи размер файла в интернете (это где-то на форуме уже обсуждалось)


sad.gif не могу найти sad.gif
и на других форумах никто ничего сказать не может
подскажите, плиз!

Автор: PROme 19.1.2004, 19:25
Проблема решена.
Нужно юзать InternetQueryDataAvailable(hURL, fSize,0,0);
Всем спасибо!

Автор: PROme 27.1.2004, 19:39
Так, в продолжение появилась еще одна проблема (даже две), так что я решил возрабить топик =))
А проблема в следующем - запускаем прогу, все ок, скачивает, как надо... но вот при повторной скачке он не качает (а только делает вид) и записывает файл на винт с какого-то буфера... как от этого избавитьсяconfused.gif
На всякий случай код:

Код
procedure TForm2.GetInetFile(const fileURL, FileName: String);
const BufferSize = 32768;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
BufferLen, fSize: DWORD;
f: File;
sAppName: string;
begin
fSize:=0;
hSession := InternetOpen( PChar(sAppName),
             INTERNET_OPEN_TYPE_PRECONFIG,
             nil, nil, 0);
try
hURL := InternetOpenURL( hSession,
         PChar(fileURL),
         nil,0,0,0);
InternetQueryDataAvailable(hURL, fSize,0,0);
ProgressBar1.Max:=fSize;
try
 AssignFile(f, FileName);
 Rewrite(f,1);
 repeat
 InternetReadFile( hURL, @Buffer,SizeOf(Buffer), BufferLen);
 InternetQueryDataAvailable(hURL, fSize,0,0);
 ProgressBar1.Position:=ProgressBar1.Max-fSize;
 BlockWrite(f, Buffer, BufferLen);
 until BufferLen = 0;

 CloseFile(f);
finally
 InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end;

end;


Вторая трабла - перевод строки в текстовом файле (там Юних, тут Вин), че делать?

За ранее всем большой бииир smile.gif

Автор: Pakshin A. S. 27.1.2004, 20:55
Про скачку: в том же Inet'е есть процедурки для работы с FTP, способ закачки тот же...

Автор: PROme 27.1.2004, 21:05
Цитата
Про скачку: в том же Inet'е есть процедурки для работы с FTP, способ закачки тот же...


Спасибо, сами знаем.
Но я не это спрашивал, у меня другие проблемы!

Автор: Cheba 28.1.2004, 11:51
Цитата
Вторая трабла - перевод строки в текстовом файле (там Юних, тут Вин), че делать?
Перекодировать. У Вынь - \r\n, у Unix - \n. С заменой, думаю, сам справишся.

Автор: PROme 28.1.2004, 17:03
Цитата
Перекодировать. У Вынь - \r\n, у Unix - \n. С заменой, думаю, сам справишся.


Мдя... оказалось еще проще... вот тока что лазил по FAQсам... нашел http://forum.vingrad.ru/index.php?act=ST&f=32&t=1924

заюзал тупо

Код
Memo1.lines.loadfromfile('c:\temp.txt');
Memo1.lines.savetoFile('c:\temp_r.txt');


уже сразу после открытия файл ок, так и сохраняет... встроенная поддержка в дельфяхconfused.gif

Ну, теперь народ, подскажите что со скачкойconfused.gif Куда он его запихуетconfused.gif Как это местечно отчистить или заставить его каждый раз качать принудительноconfused.gif

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