На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> не могу скачать файл с интернета
    нижеследующий код не работает после переустановки винды, в чем проблема
    ExpandedWrap disabled
      function GetInetFile(const fileURL, FileName: string): boolean;
      const
        BufferSize = 1024;
      var
        hSession, hURL: HInternet;
        Buffer: array[1..BufferSize] of Byte;
        BufferLen: DWORD;
        f: file;
        sAppName: string;
      begin
        Result := False;
        sAppName := ExtractFileName(Application.ExeName);
        hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
        try
          hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);  //вот здесь hURL получается nil
          try
            AssignFile(f, FileName);
            Rewrite(f,1);
            repeat
              application.ProcessMessages;
              InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
              BlockWrite(f, Buffer, BufferLen);
            until
              BufferLen = 0;
            CloseFile(f);
            Result := True;
          except
            CloseFile(f);
          end;
          InternetCloseHandle(hURL);
        finally
          InternetCloseHandle(hSession);
        end;
      end;

    очень нужно, раньше такого небыло
    Сообщение отредактировано: BOGDANchik -
      в общем вопрос решен
      оказалось дело в винде а не в исходном коде
        а у меня переменная BufferLen не меняется, постоянно большое число и не пишется в файл.

        Добавлено
        у меня тоже
        hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0); //вот здесь hURL получается nil

        Добавлено
        ftp требует имя и пароль куда их пихать???
          ExpandedWrap disabled
            ////////////////////////////////////////////////////////////////////////////////
            //
            //  ****************************************************************************
            //  * Project   : DownloadViaProxy
            //  * Purpose   : Демо скачивания файла с учетом бейсик авторизации и прокси
            //  * Author    : Александр (Rouse_) Багель
            //  * Copyright : © Fangorn Wizards Lab 1998 - 2007.
            //  * Version   : 1.03
            //  * Home Page : http://rouse.drkb.ru
            //  ****************************************************************************
            //
             
            program DownloadViaProxy;
             
            {$APPTYPE CONSOLE}
             
            uses
              Windows,
              SysUtils,
              Classes,
              WinInet;
             
            type
              TDownloadParams = record
                FileURL,                // Запрос для файла
                Proxy,                  // список прокси
                ProxyBypass,            // дополниотельный список прокси
                AuthUserName,           // логин для Authorization: Basic
                AuthPassword: String;   // пароль для Authorization: Basic
                DownloadFrom,           // смещение от начала данных
                NeedDataSize: DWORD;    // необходимый размер
              end;
             
            function DownloadFileEx(
             Params: TDownloadParams; OutputData: TStream): Boolean;
             
             function DelHttp(URL: String): String;
             var
               HttpPos: Integer;
             begin
               HttpPos := Pos('http://', URL);
               if HttpPos > 0 then Delete(Url, HttpPos, 7);
               Result := Copy(Url, 1, Pos('/', Url) - 1);
               if Result = '' then Result := URL;
             end;
             
            const
             Accept = 'Accept: */*' + sLineBreak;
             ProxyConnection = 'Proxy-Connection: Keep-Alive' + sLineBreak;
             LNG = 'Accept-Language: ru' + sLineBreak;
             AGENT =
               'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; ' +
               'Windows NT 5.1; SV1; .NET CLR 2.0.50727)' + sLineBreak;
            var
             FSession, FConnect, FRequest: HINTERNET;
             FHost, FScript, SRequest, ARequest: String;
             Buff, IntermediateBuffer: array of Byte;
             BytesRead, Res, Len,
             FilePosition, OpenTypeFlags, ContentLength: Cardinal;
            begin
              Result := False;
              ARequest := Params.FileURL;
             
              // Небольшой парсинг
              // вытаскиваем имя хоста и параметры обращения к скрипту
              FHost := DelHttp(ARequest);
              FScript := ARequest;
              Delete(FScript, 1, Pos(FHost, FScript) + Length(FHost));
             
              // Инициализируем WinInet
              if Params.Proxy = '' then
               OpenTypeFlags := INTERNET_OPEN_TYPE_PRECONFIG
              else
               OpenTypeFlags := INTERNET_OPEN_TYPE_PROXY;
              FSession := InternetOpen('',
              OpenTypeFlags, PChar(Params.Proxy), PChar(Params.ProxyBypass), 0);
             
              if not Assigned(FSession) then Exit;
              try
                // Попытка соединения с сервером
                FConnect := InternetConnect(FSession, PChar(FHost),
                  INTERNET_DEFAULT_HTTP_PORT, PChar(Params.AuthUserName),
                  PChar(Params.AuthPassword), INTERNET_SERVICE_HTTP, 0, 0);
             
                if not Assigned(FConnect) then Exit;
                try
             
                  // Подготавливаем запрос
                  FRequest := HttpOpenRequest(FConnect, 'GET', PChar(FScript), nil,
                    '', nil, 0, 0);
             
                  // добавляем необходимые заголовки к запросу
                  HttpAddRequestHeaders(FRequest, Accept,
                    Length(Accept), HTTP_ADDREQ_FLAG_ADD);
                  HttpAddRequestHeaders(FRequest, ProxyConnection,
                    Length(ProxyConnection), HTTP_ADDREQ_FLAG_ADD);
                  HttpAddRequestHeaders(FRequest, LNG,
                    Length(LNG), HTTP_ADDREQ_FLAG_ADD);
                  HttpAddRequestHeaders(FRequest, AGENT,
                    Length(AGENT), HTTP_ADDREQ_FLAG_ADD);
             
                  // Проверяем запрос:
                  Len := 0;
                  Res := 0;
                  SRequest := ' ';
                  HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or
                    HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);
                  if Len > 0 then
                  begin
                     SetLength(SRequest, Len);
                    HttpQueryInfo(FRequest, HTTP_QUERY_RAW_HEADERS_CRLF or
                      HTTP_QUERY_FLAG_REQUEST_HEADERS, @SRequest[1], Len, Res);
                  end;
             
                  if not Assigned(FConnect) then Exit;
                  try
             
                    // Отправляем запрос
                    if not (HttpSendRequest(FRequest, nil, 0, nil, 0)) then Exit;
             
                    // Узнаем размер файла
                    ContentLength := InternetSetFilePointer(
                      FRequest, 0, nil, FILE_END, 0);
                    if ContentLength = DWORD(-1) then
                      ContentLength := 0;
             
                    // выставляем позцию, откуда нужно начинать скачку
                    FilePosition := InternetSetFilePointer(
                      FRequest, Params.DownloadFrom, nil, FILE_BEGIN, 0);
                    if FilePosition = DWORD(-1) then
                      FilePosition := 0;
             
                    // Выставляем размер приемного буффера
                    if Params.NeedDataSize = 0 then
                      Params.NeedDataSize := ContentLength;
                    if Integer(FilePosition) + Params.NeedDataSize >
                      Integer(ContentLength) then
                      Params.NeedDataSize := ContentLength - FilePosition;
             
                     // если не смогли определить размер данных - читаем все что прочтется
                    if Params.NeedDataSize <= 0 then
                    begin
                      SetLength(IntermediateBuffer, 8192);
                      ContentLength := 0;
                      Params.NeedDataSize := 0;
                      BytesRead := 0;
                      while InternetReadFile(FRequest, @IntermediateBuffer[0],
                        100, BytesRead) do
                          if BytesRead > 0 then
                        begin
                          SetLength(Buff, ContentLength + BytesRead);
                          Move(IntermediateBuffer[0], Buff[ContentLength], BytesRead);
                          Inc(ContentLength, BytesRead);
                        end
                        else
                        begin
                          Params.NeedDataSize := ContentLength;
                          Break;
                        end;
                    end
                    else
                    begin
                      // в противном случае, принимаем данные как обычно
                      SetLength(Buff, Params.NeedDataSize);
                      if not InternetReadFile(FRequest, @Buff[0],
                        Params.NeedDataSize, BytesRead) then Exit;
                    end;
             
                    OutputData.Write(Buff[0], Params.NeedDataSize);
                    Result := True;
             
                  finally
                    InternetCloseHandle(FRequest);
                  end;
                finally
                  InternetCloseHandle(FConnect);
                end;
              finally
                InternetCloseHandle(FSession);
              end;
            end;
             
            var
              Params: TDownloadParams;
              Data: TMemoryStream;
            begin
              try
                ZeroMemory(@Params, SizeOf(TDownloadParams));
                Params.FileURL :=
                  'http://google.com/index.html';
                Data := TMemoryStream.Create;
                try
                  if DownloadFileEx(Params, Data) then
                    Data.SaveToFile('c:\test.htm');
                finally
                  Data.Free;
                end;
                
              except
                on E:Exception do
                  Writeln(E.Classname, ': ', E.Message);
              end;
            end.


          Еще пример использования

          ExpandedWrap disabled
            function GetMultiproxyProxyList(ResultList: TStringList): Boolean;
            var
              Params: TDownloadParams;
              Data: TStringStream;
              AResult: String;
            begin
              Result := False;
              ZeroMemory(@Params, SizeOf(TDownloadParams));
              Params.FileURL :=
                'http://multiproxy.org/txt_all/proxy.txt';
              Data := TStringStream.Create('');
              try
                if DownloadFileEx(Params, Data) then
                begin
                  SetLength(AResult, Data.Size);
                  Data.Read(AResult, Data.Size);
                  ResultList.Text := AResult;
                  Result := True;
                end;
              finally
                Data.Free;
              end;
            end;


          Еще один пример использования, но вот этот сервер не дает размер файла:

          ExpandedWrap disabled
            function GetProxyListOrgProxyList(ResultList: TStringList): Boolean;
            var
              Params: TDownloadParams;
              Data: TStringStream;
              AResult: String;
            begin
              Result := False;
              ZeroMemory(@Params, SizeOf(TDownloadParams));
              Params.FileURL :=
                'http://proxy-list.org/downloadproxylist.php?sp=-1&pp=any&pt=any&pc=any&ps=any';
              // Params.DownloadFrom := 4; // <- попытка дозакачки...
              Data := TStringStream.Create('');
              try
                if DownloadFileEx(Params, Data) then
                begin
                  if Data.Size = 0 then
                  begin
                    ResultList.Add('Сервер не поддерживает дозакачку.');
                    Exit;
                  end;
                  SetLength(AResult, Data.Size);
                  Data.Read(AResult, Data.Size);
                  ResultList.Text := AResult;
                  Result := True;
                end;
              finally
                Data.Free;
              end;
            end;
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0361 ]   [ 16 queries used ]   [ Generated: 28.04.24, 14:18 GMT ]