如何让wininet只下载gif图片
how to make wininet download gif images only
我正在使用 Wininet
下载图像并将它们保存到内存流,但出于更多管理原因,我只想允许下载 gif images
和 jpg
我尝试添加检查 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) 的起点,请参阅:
我正在使用 Wininet
下载图像并将它们保存到内存流,但出于更多管理原因,我只想允许下载 gif images
和 jpg
我尝试添加检查 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) 的起点,请参阅: