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

Вопрос Скачивание файла из интернета (Delphi 7)

Тема в разделе "Delphi", создана пользователем ExPlayer, 30 июн 2016.

  1. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    376
    Симпатии:
    69
    Всем доброго времени суток! Есть у кого-нибудь пример, как можно скачать файл из интернета с отображением прогресса в прогрессбаре (желательно примерчик на Indy 7 или WinInet :))?

    P.S. Находил в инете примеры под Indy 10, но я затрахался его ставить на 7-ю делфу и в результате нормально он не встал в следствии чего ошибки при компиляции :(.

    P.P.S. Еще проблема Indy 10 в том, что он почему-то не читает нормально кириллицу из файла на сервере :(
     
  2. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    376
    Симпатии:
    69
    Похоже, что никто не знает :(
     
  3. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    729
    Симпатии:
    455
    А почему бы не использовать curl?
     
  4. Ветеран

    Регистрация:
    5 мар 2014
    Сообщения:
    376
    Симпатии:
    69
    у меня проблема именно с прогрессбаром. Даже если присоединить к проекту curl возникнет тот же вопрос, как сделать корректное отображение процесса загрузки в прогрессбаре :unknown:
     
  5. Ветеран Проверенный

    Регистрация:
    15 июн 2011
    Сообщения:
    217
    Симпатии:
    67
    Я на Си использовал libcurl. Указываешь свою callback функцию, и при скачивании можешь получить текущий размер скачанного файла. Так что думаю что для Дельфи не должно быть сложно это сделать.
     
  6. Он где то тут Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    729
    Симпатии:
    455
  7. Знаток Проверенный

    Регистрация:
    21 июн 2011
    Сообщения:
    79
    Симпатии:
    162
    в интернете вроде полно примеров
    вот кусок простейшего кода

    Код (Text):

    type
      TmcCharArray = array of AnsiChar;

    procedure SaveStringToFile(FileName, SourceString : string);
    const
      fmShareExclusive = $0010;
    var
      Stream : TFileStream;
    begin
      Stream:= TFileStream.Create(FileName, fmCreate, fmShareExclusive);
      try
        Stream.WriteBuffer(PChar(SourceString)^, Length(SourceString));
      finally
      Stream.Free;
      end;
    end;

    function SaveInternetObjectToStringA(ObjURL: string; OutString: PChar): DWORD; stdcall;
    const
      MaxCount = 255;
    var
      s: string;
    begin
      ZeroMemory(OutString, MaxCount);
      s := GetInternetObject(ObjURL);
      if Length(s) > MaxCount then SetLength(s, MaxCount);
      StrPCopy(OutString, s);
      Result := StrLen(OutString);
    end;

    function SaveInternetObjectToFileA(ObjURL, FileName: string): boolean; stdcall;
    var
      s: string;
    begin
      s := GetInternetObject(ObjURL);
      Result := Length(s) > 0;
      if Result then SaveStringToFile(FileName, s);
    end;

    function GetInternetObject(const ObjURL: string): string;
    const
      tmpBuffSize = 1024;
    var
      hSession, hURL: HInternet;
      tmpBuff: array [0..tmpBuffSize - 1] of Byte;
      Buff: TmcCharArray;
      ReededSize: DWORD;
      BuffLen: DWORD;
    begin
      Result := '';

      hSession := InternetOpen('InetUtils', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      if not Assigned(hSession) then Exit;

      hURL := InternetOpenURL(hSession, PChar(ObjURL), nil, 0, 0, 0);
      if not Assigned(hURL) then begin
        InternetCloseHandle(hSession);
        Exit;
      end;

      SetLength(Buff, 0);
      repeat
        InternetReadFile(hURL, @tmpBuff, SizeOf(tmpBuff), ReededSize);
        BuffLen := Length(Buff);
        SetLength(Buff, BuffLen + ReededSize);
        Move(tmpBuff[0], Buff[BuffLen], ReededSize);
      until ReededSize = 0;
      Result := ArrayToString(Buff);

      InternetCloseHandle(hURL);
      InternetCloseHandle(hSession);
    end;
     
    в теле цикла можно дописать все, что нужно

    ЗЫ инди лучше не пользоваться, там в базовом классе ошибка, которую даже в последних версиях не исправили (если при отправке/получении данных обрывается связь, то индюшный компонент виснет. приложение приходится срубать через диспетчер задач). когда-то давно много времени потратил, чтобы найти этот косяк
     
    Последнее редактирование: 28 июл 2016
    ExPlayer, YURSHAT и Krinkels нравится это.

Поделиться этой страницей