如何让wininet只下载gif图片

how to make wininet download gif images only

我正在使用 Wininet 下载图像并将它们保存到内存流,但出于更多管理原因,我只想允许下载 gif imagesjpg 我尝试添加检查 FURL 但从 url 中提取文件扩展名对我来说是错误的步骤这里是我的 wininet 函数

function DownloadToStream: Boolean;
var
  hSession     : HINTERNET;
  hService     : HINTERNET;
  lpBuffer     : array[0..1023] of Byte;
  dwBytesRead  : DWORD;
  dwBytesAvail : DWORD;
  dwTimeOut    : DWORD;
  Sessionname : String;
  Setsession : Pwidechar;
begin
  Result := False;
  Sessionname := nameofsession;
  Setsession := pwidechar(Sessionname);
  hSession := InternetOpen(Setsession, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if not Assigned(hSession) then Exit;
  try
    hService := InternetOpenUrl(hSession, PChar(FUrl), nil, 0, 0, 0);
    if hService = nil then
      Exit;
    try
      dwTimeOut := 60000;
      InternetSetOption(hService, INTERNET_OPTION_RECEIVE_TIMEOUT, @dwTimeOut, SizeOf(dwTimeOut));
      if InternetQueryDataAvailable(hService, dwBytesAvail, 0, 0) then
      repeat
        if not InternetReadFile(hService, @lpBuffer[0], SizeOf(lpBuffer), dwBytesRead) then
          Break;
        if dwBytesRead <> 0 then
          FMs.WriteBuffer(lpBuffer[0], dwBytesRead);
      until dwBytesRead = 0;
      Result := FMS.Size > 0;
    finally
      InternetCloseHandle(hService);
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

这是必须从许多不同角度来管理的事情。在此过程中没有任何地方可以进行检查以确保您只下载 .gif 文件。

考虑...

  • 一个 URL 喜欢 http://somesite.com/Logo 没有扩展名
  • Web 服务器响应错误页面
  • Web 服务器响应意外的文件格式
  • 网络服务器响应正确的图像,但图像格式不同
  • 不支持返回内容类型的网络服务器

您必须考虑实施的是...

  • Parsing the URI检查资源扩展(如果有的话)
  • Fetching only header 首先(如果服务器支持)并检查内容类型
  • 下载文件后,read the first little bit检查格式

其中每一个都是完全不同的解决方案,具体取决于您的要求,您可能只需要使用一个、两个或全部三个。

您可以发送 HTTP HEAD 请求并查看内容类型 response header。如果它是 image/gif 那么可以安全地假设该资源是一个 gif 图像。当然这需要正确配置的 HTTP 服务器。

作为 (Delphi) 的起点,请参阅: