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

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

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

  1. Пользователь

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

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

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

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

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

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

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

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

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

    Код (Text):
    1.  
    2. type
    3.   TmcCharArray = array of AnsiChar;
    4.  
    5. procedure SaveStringToFile(FileName, SourceString : string);
    6. const
    7.   fmShareExclusive = $0010;
    8. var
    9.   Stream : TFileStream;
    10. begin
    11.   Stream:= TFileStream.Create(FileName, fmCreate, fmShareExclusive);
    12.   try
    13.     Stream.WriteBuffer(PChar(SourceString)^, Length(SourceString));
    14.   finally
    15.   Stream.Free;
    16.   end;
    17. end;
    18.  
    19. function SaveInternetObjectToStringA(ObjURL: string; OutString: PChar): DWORD; stdcall;
    20. const
    21.   MaxCount = 255;
    22. var
    23.   s: string;
    24. begin
    25.   ZeroMemory(OutString, MaxCount);
    26.   s := GetInternetObject(ObjURL);
    27.   if Length(s) > MaxCount then SetLength(s, MaxCount);
    28.   StrPCopy(OutString, s);
    29.   Result := StrLen(OutString);
    30. end;
    31.  
    32. function SaveInternetObjectToFileA(ObjURL, FileName: string): boolean; stdcall;
    33. var
    34.   s: string;
    35. begin
    36.   s := GetInternetObject(ObjURL);
    37.   Result := Length(s) > 0;
    38.   if Result then SaveStringToFile(FileName, s);
    39. end;
    40.  
    41. function GetInternetObject(const ObjURL: string): string;
    42. const
    43.   tmpBuffSize = 1024;
    44. var
    45.   hSession, hURL: HInternet;
    46.   tmpBuff: array [0..tmpBuffSize - 1] of Byte;
    47.   Buff: TmcCharArray;
    48.   ReededSize: DWORD;
    49.   BuffLen: DWORD;
    50. begin
    51.   Result := '';
    52.  
    53.   hSession := InternetOpen('InetUtils', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    54.   if not Assigned(hSession) then Exit;
    55.  
    56.   hURL := InternetOpenURL(hSession, PChar(ObjURL), nil, 0, 0, 0);
    57.   if not Assigned(hURL) then begin
    58.     InternetCloseHandle(hSession);
    59.     Exit;
    60.   end;
    61.  
    62.   SetLength(Buff, 0);
    63.   repeat
    64.     InternetReadFile(hURL, @tmpBuff, SizeOf(tmpBuff), ReededSize);
    65.     BuffLen := Length(Buff);
    66.     SetLength(Buff, BuffLen + ReededSize);
    67.     Move(tmpBuff[0], Buff[BuffLen], ReededSize);
    68.   until ReededSize = 0;
    69.   Result := ArrayToString(Buff);
    70.  
    71.   InternetCloseHandle(hURL);
    72.   InternetCloseHandle(hSession);
    73. end;
    74.  
    в теле цикла можно дописать все, что нужно

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

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