2

我有一个 TImage,它显示文件夹中的 JPG 图像。每个 JPG 图像名称都是数字(例如 5968.jpg) 如果 JPG 图像不存在,我目前加载模板 JPG。

但是,我想在检查本地文件夹后检查互联网

我知道 URL,我只是将图像编号和扩展名连接起来(例如' http://www.myurl.com/images/'+ Tags.Names[Index] +'.jpg')

如果本地不存在此图像,我想下载它。

if FileExists(TagPath + Tags.Names[Index] + '.jpg') then
    imgTag.Picture.LoadFromFile(TagPath + Tags.Names[Index] + '.jpg')
   else
    imgTag.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Template.jpg');

我如何将图像(使用 idHTTP?)下载到 TImage(imgTag)。我将如何处理任何异常。

流程应该是这样,没有任何错误。

if FileExists locally, load image
else
 if fileEists on the internet load Image
  else
   Load the template

谢谢

4

3 回答 3

3

您可以使用 Indy 的TIdHTTP组件,例如:

uses
  ..., IdHTTP;

var
  FileName: string;
  Strm: TMemoryStream;
begin
  FileName := TagPath + Tags.Names[Index] + '.jpg';
  if not FileExists(FileName) then
  begin
    try
      Strm := TMemoryStream.Create;
      try
        HTTP := TIdHTTP.Create(nil);
        try
          HTTP.Get('http://www.myurl.com/images/' + Tags.Names[Index] + '.jpg', Strm);
        finally
          HTTP.Free;
        end;
        Strm.Position := 0;
        Strm.SaveToFile(FileName);
      finally
        Strm.Free;
      end;
    except
      FileName := ExtractFilePath(Application.ExeName) + 'Template.jpg';
    end;
  end;
  imgTag.Picture.LoadFromFile(FileName);
end;
于 2013-03-13T04:59:13.573 回答
0

您可以使用标准TDownloadURL操作来简单地下载互联网并将其添加到您的逻辑中,如下所示:

uses
  ExtActns;

function TMyForm.TryDownloadFile(const AURL, AFileName: string): Boolean;
begin
  Result := False;
  with TDownLoadURL.Create(nil) do
  try
    URL := AURL;
    Filename := AFileName;
    try
      ExecuteTarget(nil);
      Result := True;
    except
      ; //please, improve this handling specific exceptions
    end;
  finally
    Free;
  end;
end;

procedure TMyForm.LoadFile(Index: Integer);
var
  FileName: string;
begin
  FileName := TagPath + Tags.Names[Index] + '.jpg';
  if not FileExists(FileName) then
    if not TryDownlaodFile('http://www.myurl.com/images/' + Tags.Names[Index] + '.jpg', 
      FileName) then
      FileName := ExtractFilePath(Application.ExeName) + 'Template.jpg';
  imgTag.Picture.LoadFromFile(FileName);
end;

显示的代码罪过是我在异常处理程序中吃掉了任何异常,这是一个不好的做法,但我直接在这个窗口中写了这个答案,没有时间检查在不同的失败场景中可以通过操作引发哪些特定异常. 如果您做出改进并回来并为社区做出贡献,那就太好了。

于 2013-03-13T01:26:53.603 回答
0

我通常使用此代码检查网络服务器上是否存在文件

function CheckUrl(url: string): boolean;
var
  hSession, hfile, hRequest: hInternet;
  dwindex,dwcodelen: DWord;
  dwcode:array[1..20] of Char;
  res: PChar;
begin
  if Pos('http://', LowerCase(url)) = 0 then
    url := 'http://' + url;
  Result := False;
  hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hsession) then
  begin
    hfile := InternetOpenUrl(hsession, PChar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwCode, dwCodeLen, dwIndex);
    res := PChar(@dwCode);
    Result := (res = '200') or (res = '302');
    if Assigned(hFile) then
      InternetCloseHandle(hFile);
    InternetCloseHandle(hSession);
  end;
end;

并下载文件,您可以使用 Jachguate 答案

于 2013-03-13T03:29:49.823 回答