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

Ограничение загрузки изображений: фильтрация форматов GIF и JPG с помощью WinInet в Delphi

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

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

Проблема

В коде, представленном пользователем, используется функция DownloadToStream для загрузки изображений в память. Однако, необходимо внести изменение, чтобы функция позволяла загружать только изображения форматов GIF и JPG. Попытка извлечения расширения файла из URL оказалась неудачной, так как это может быть не всегда надежным методом.

Решение

Для решения задачи необходимо использовать несколько подходов:

  1. Парсинг URI: Чтобы проверить расширение ресурса, если таковое имеется. Например, URL https://example.com/image.jpg имеет расширение .jpg.
  2. Получение только заголовков: Если сервер поддерживает, можно сначала получить только заголовки ответа, чтобы проверить тип содержимого.
  3. Проверка данных после загрузки: После загрузки файла можно проверить первые несколько байтов на соответствие формату GIF или JPG.

Примеры реализации

Парсинг URI

function GetFileExtension(const URL: string): string;
var
  Path: string;
begin
  Path := ExtractFilePath(URL);
  Result := ExtractFileExt(Path);
end;

Получение только заголовков

function GetContentType(const URL: string): string;
var
  hSession: HINTERNET;
  hRequest: HINTERNET;
begin
  hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  hRequest := InternetOpenUrl(hSession, PChar(URL), nil, 0, INTERNET_FLAG_RELOAD or INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_RUNTIME_HANDLING, 0);
  if hRequest <> nil then
  begin
    var dwLen: DWORD;
    var lpData: PCHAR;
    if InternetQueryOption(hRequest, INTERNET_OPTION_DATA_TYPE, lpData, SizeOf(lpData), dwLen) then
      if dwLen >= SizeOf(DWORD) then
        if lpData^ = INTERNET_DATA_TYPE_STANDARD then
        begin
          if InternetQueryHeaders(hRequest, HTTP_QUERY_CONTENT_TYPE, nil, 0, dwLen, nil) then
          begin
            SetLength(Result, dwLen + 1);
            InternetQueryHeaders(hRequest, HTTP_QUERY_CONTENT_TYPE, PChar(Result), dwLen, nil);
          end;
        end;
    InternetCloseHandle(hRequest);
  end;
  InternetCloseHandle(hSession);
end;

Проверка данных после загрузки

function IsGIF(const Data: TArray<byte>): Boolean;
begin
  // Проверка на наличие GIF-сигнатуры
  Result := (Length(Data) >= 3) and (Data[0] = $47) and (Data[1] = $49) and (Data[2] = $46);
end;

function IsJPEG(const Data: TArray<byte>): Boolean;
begin
  // Проверка на наличие JPEG-сигнатуры
  Result := (Length(Data) >= 2) and ((Data[0] = $FF) and (Data[1] = $D8)) or
            (Length(Data) >= 3) and (Data[0] = $89) and (Data[1] = $50) and (Data[2] = $4E) PPM/RAW/etc.
end;

Заключение

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

Обратите внимание, что для полноценной реализации этих функций потребуется дополнительная работа, включая обработку исключений и возможных ошибок сети.

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

Задача состоит в том, чтобы ограничить загрузку изображений в приложении на Delphi с использованием WinInet, допуская только форматы GIF и JPG.


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

Получайте свежие новости и обновления по 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 09:14:47/0.0078880786895752/1