【发布时间】:2015-11-22 12:34:21
【问题描述】:
我正在使用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;
【问题讨论】:
-
听起来你需要像这样解析 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