Контроль загрузки файлов - PullRequest
2 голосов
/ 21 января 2012

Я создаю программу обновления для моей программы с использованием TWebBrowser. При создании TWebBrowser перейдет по указанному URL. Чтобы загрузить обновление, пользователь должен щелкнуть ссылку. При нажатии на ссылку появляется это всплывающее окно:

enter image description here

Поэтому мне было интересно, можно ли было:

  1. Пропустить это всплывающее окно и разрешить автоматическую загрузку.
  2. Установите фиксированный путь, по которому файл будет загружаться.

Ответы [ 2 ]

9 голосов
/ 21 января 2012

Я бы использовал компонент Indy's TIdHTTP для этого, например:

uses
  ..., IdHTTP;

var
  Url, LocalFile: String;
  Strm: TFileStream;
begin
  Url := ...;
  LocalFile := ...;
  Strm := TFileStream.Create(LocalFile, fmCreate);
  try
    try
      IdHTTP.Get(Url, Strm);
    finally
      Strm.Free;
    end;
  except
    DeleteFile(LocalFile);
    raise;
  end;
end;
2 голосов
/ 21 января 2012

TWebBrowser - это не то, что вам нужно, поскольку вы не отображаете активный HTML-контент. Как было сказано ранее, существует множество других вариантов. В основном вы хотите HTTP-запрос.

Вот очень простой пример использования WinInet, который необходимо адаптировать к вашим потребностям (потоки, сообщения о состоянии и т. Д.).

function DownloadURL(inURL, destfile: string): boolean;
  var
    hOpen: HINTERNET;
    hFile: HINTERNET;
    myAgent: string;
    savefile: file;
    amount_read: integer;
   // the buffer size here generally reflects maximum MTU size.
   // for efficiency sake, you don't want to use much more than this.
    mybuffer: array[1..1460] of byte;
  begin
    Result := true;
    myAgent := 'Test downloader app';
   // other stuff in this call has to do with proxies, no way for me to test
    hOpen := InternetOpen(PChar(myAgent), 0, nil, nil, 0);
    if hOpen = nil then
      begin
        Result := false;
        exit;
      end;
    try
      hFile := InternetOpenURL(hOpen, PChar(inURL), nil, 0,
           INTERNET_FLAG_RELOAD or INTERNET_FLAG_DONT_CACHE, 0);
      if hFile = nil then
        begin
          Result := false;
          exit;
        end;
      try
        AssignFile(savefile, destfile);
        Rewrite(savefile, 1);
        InternetReadFile(hFile, @myBuffer, sizeof(mybuffer), amount_read);
        repeat
          Blockwrite(savefile, mybuffer, amount_read);
          InternetReadFile(hFile, @myBuffer, sizeof(mybuffer), amount_read);
        until amount_read = 0;
        CloseFile(savefile);
      finally
        InternetCloseHandle(hFile);
      end;
    finally
      InternetCloseHandle(hOpen);
    end;
  end;

procedure TForm1.Button1Click(Sender: TObject);
  // example usage.
  begin
    if SaveDialog1.Execute then
      begin
        if DownloadURL(Edit1.Text, SaveDialog1.FileName) then
          ShowMessage('file downloaded.')
        else
          ShowMessage('Error downloading file.');
      end;
  end;
...