【问题标题】:how to make wininet download gif images only如何使wininet只下载gif图像
【发布时间】:2015-11-22 12:34:21
【问题描述】:

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

【问题讨论】:

  • 听起来你需要像这样解析 URI:stackoverflow.com/a/16703210/988445 然后你可以从“路径”属性中提取文件扩展名。
  • 问题我会卡在一些 url 可能是这样的:i.stack.imgur.com/j0w2S.jpg?s=64&g=1 和一些 url 可能是这样的 - :i.stack.imgur.com/j0w2S.jpg 或 url 也可以是 .html 或 php
  • 是的,所以解析URL会自己直接提取j0w2S.jpg,这样就可以检测到.jpg了。
  • 如果您不能使用您的 URI 来过滤项目,那么您需要查看数据以查看是否可以找到 JPG 或 GIF 标头。这个问题有一些代码来检查图像类型的流:stackoverflow.com/questions/959160/… 查看第一个答案中名为DetectImage 的方法。
  • @JerryDodge 我看不出它是如何工作的。 Web 服务器将直接从 URL 流回不带任何标头信息的数据。

标签: delphi http delphi-xe7 wininet


【解决方案1】:

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

考虑...

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

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

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

【讨论】:

  • 谢谢你,杰瑞,我开始遵循指示
  • 检查实际下载的文件数据是否有 GIF 标头是最佳选择,因为所有其他选项都可以发送报告正确类型的非 GIF 数据,或者可以撒谎并声称实际上没有请求/发送 GIF。不要抓住机会。在使用之前验证下载的数据。
  • @Remy 嗯,是的,还不清楚 OP 想要以何种方式保护免受其他格式的影响,所以我想我会提供一系列可能的实现来满足他们的精确需求。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2016-03-14
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多