Загрузите jpg из Интернета без ошибок, иначе загрузите template.jpg

У меня есть 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

спасибо


person JakeSays    schedule 13.03.2013    source источник


Ответы (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;
person Remy Lebeau    schedule 13.03.2013
comment
Привет, Реми, спасибо, но мне очень нужна часть загрузки изображения с использованием idhttp, мне было интересно узнать об отсутствии подключения к Интернету и отсутствии файлов в интернет-сценариях. Если файл не существует локально, загрузите из Интернета, но если не удается загрузить из Интернета, загрузите файл шаблона - спасибо - person JakeSays; 13.03.2013
comment
Это все включено в приведенный выше код... Имя файла шаблона присваивается переменной FileName, когда TIdHTTP не удается получить файл по указанному URL-адресу (если он еще не существует локально). - person TLama; 13.03.2013
comment
если у них нет подключения к Интернету, ваш код вылетает вместо загрузки шаблона - person JakeSays; 13.03.2013
comment
Там обрабатываются все исключения, поэтому вы, вероятно, увидите сообщение отладчика, уведомляющее вас о возникшем исключении, но вы не увидите это сообщение, если запустите приложение без отладчика. В любом случае, если вы нажмете «Продолжить» в этом сообщении, программа продолжит работу. - person TLama; 13.03.2013
comment
Вот что я делал! Спасибо! - person JakeSays; 14.03.2013

Вы можете прибегнуть к стандартному действию 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;

Грех показанного кода заключается в том, что я ем любое исключение в обработчике исключений, и это плохая практика, но я написал этот ответ прямо в этом окне, и у меня нет времени проверять, какие конкретные исключения могут быть вызваны в различных сценариях отказа с помощью действия . Было бы неплохо, если бы вы сделали эти улучшения и вернулись и внесли свой вклад в сообщество.

person jachguate    schedule 13.03.2013
comment
Ваш код загружает изображение, но когда TImage пытается его загрузить, выдает ошибку #53. - person JakeSays; 13.03.2013
comment
ммм, не знаю что сказать, попробовал сейчас свой метод с XE-XE3 и работает хорошо, может баг в действии 2010 года. - person jachguate; 13.03.2013

я обычно использую этот код, чтобы проверить, существует ли файл на веб-сервере

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

person AsepRoro    schedule 13.03.2013
comment
Сначала мне нужно определить, является ли это соединением. Эта функция не будет работать, если нет подключения к интернету. - person JakeSays; 13.03.2013
comment
если тот, кто вам нужен, вы можете использовать функцию ping в первую очередь. - person AsepRoro; 13.03.2013