Вопрос, с которым мы сталкиваемся, заключается в необходимости ограничения процесса загрузки изображений, используя библиотеку WinInet, так чтобы загружались только изображения форматов GIF и JPG. Это может быть важно по ряду причин, включая улучшение управления памятью и повышение производительности приложения.
Проблема
В коде, представленном пользователем, используется функция DownloadToStream для загрузки изображений в память. Однако, необходимо внести изменение, чтобы функция позволяла загружать только изображения форматов GIF и JPG. Попытка извлечения расширения файла из URL оказалась неудачной, так как это может быть не всегда надежным методом.
Решение
Для решения задачи необходимо использовать несколько подходов:
Парсинг URI: Чтобы проверить расширение ресурса, если таковое имеется. Например, URL https://example.com/image.jpg имеет расширение .jpg.
Получение только заголовков: Если сервер поддерживает, можно сначала получить только заголовки ответа, чтобы проверить тип содержимого.
Проверка данных после загрузки: После загрузки файла можно проверить первые несколько байтов на соответствие формату 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.