2

フォルダーから JPG 画像を表示する TImage があります。各 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

私は通常、このコードを使用して、ファイルがWebサーバーに存在するかどうかを確認します

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 に答える