如何制作wininet下载gif图像

时间:2015-08-27 23:26:40

标签: delphi http delphi-xe7 wininet

我正在使用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;

2 个答案:

答案 0 :(得分:4)

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

作为(Delphi)的起点,请参阅:https://stackoverflow.com/a/9166393/80901

答案 1 :(得分:3)

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

考虑...

  • http://somesite.com/Logo这样没有扩展名的网址
  • 使用错误页面回复的网络服务器
  • 使用意外文件格式回复的网络服务器
  • 使用正确的图片回复但是图片格式不同的网络服务器
  • 不支持返回内容类型的网络服务器

您需要考虑实施的是......

根据您的要求,这些都是完全不同的解决方案,您可能只需要使用一个,两个或全部三个。