Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Определение полного размера файла с помощью WinInet и HTTP HEAD

Delphi , ОС и Железо , Windows

В процессе разработки программ для загрузки файлов с интернета часто возникает необходимость узнать полный размер файла до начала загрузки. Это может быть важно для отображения прогресса загрузки или для проверки целостности файла после скачивания. В статье рассмотрим, как определить размер файла с помощью WinInet и HTTP HEAD запроса.

Введение в проблему

WinInet – это набор API для работы с интернет-ресурсами в Windows, который включает в себя функции для загрузки файлов. Однако, стандартный способ загрузки файла не предоставляет информацию о его размере до завершения процесса. Это может быть неудобно, если требуется отобразить прогресс загрузки или проверить размер файла до начала скачивания.

Решение проблемы

Для получения размера файла до загрузки можно использовать HTTP HEAD запрос, который позволяет получить метаданные файла, включая его размер, без фактической передачи содержимого.

Пример реализации на Object Pascal

Для примера, рассмотрим функцию GetRemoteFileSize, которая возвращает размер файла по указанному URL.

uses
  SysUtils,
  Windows,
  WinInet;

function GetRemoteFileSize(const Url : string): Integer;
var
  hInet, hConnect, hRequest: HINTERNET;
  lpdwBufferLength: DWORD;
  lpdwReserved: DWORD;
  ServerName, Resource: string;
  ErrorCode: Cardinal;
begin
  // Парсинг URL для получения хоста и пути
  ParseURL(Url, ServerName, Resource);
  Result := 0;

  // Инициализация WinInet
  hInet := InternetOpen('Mozilla/5.001', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hConnect := InternetConnect(hInet, PChar(ServerName), INTERNET_DEFAULT_HTTP_PORT, nil, nil, INTERNET_SERVICE_HTTP, 0, 0);
    try
      hRequest := HttpOpenRequest(hConnect, 'HEAD', PChar(Resource), nil, nil, nil, 0, 0);
      try
        // Отправка запроса
        if HttpSendRequest(hRequest, nil, 0, nil, 0) then
        begin
          // Получение размера файла
          lpdwBufferLength := SizeOf(Result);
          lpdwReserved := 0;
          if not HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, @Result, lpdwBufferLength, lpdwReserved) then
          begin
            ErrorCode := GetLastError;
            // Обработка ошибки
          end;
        end
        else
        begin
          ErrorCode := GetLastError;
          // Обработка ошибки
        end;
      finally
        InternetCloseHandle(hRequest);
      end;
    finally
      InternetCloseHandle(hConnect);
    end;
  finally
    InternetCloseHandle(hInet);
  end;
end;

Заключение

Использование HTTP HEAD запроса позволяет получить размер файла без необходимости скачивать его содержимое. Это удобный способ для определения размера файла перед началом загрузки, что может быть полезно в различных сценариях, связанных с обработкой файлов в интернете.

Создано по материалам из источника по ссылке.

Описание использования WinInet и HTTP HEAD запроса для определения размера файла перед его загрузкой.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 22:51:00/0.0060420036315918/0