Newsgroup: it.comp.lang.delphi
Titolo: geit Image da remote server con Indy IdHttp.Get

Cerco di caricare da client un'immagine jpeg che risiede su un server 
remoto, al momento di caricare da stream ottengo Jpeg error #53
Delphi XE8, Indy 10.6.2.5263
 
da browse '
http://maverich.altervista.org/download/IMG_2225.JPG
'
legge il file, la causa non e' "file corrotto"
 
Non escludo esistano altre vie, per farlo, la momento non ho trovato
altre soluzioni (google ... per amico)
 
var
   strStream, url: String;
   memStream: TMemoryStream;
   jpegimg: TJPEGImage;
begin
   try
     url := '
http://maverich.altervista.org/download/IMG_2225.JPG
';
     strStream := idhttp1.Get (url);
    except
      ShowMessage('Immagine non trovata');
    end;
 
   memStream := TMemoryStream.Create;
   jpegimg   := TJPEGImage.Create;
   try
     memStream.Write(strStream[1], Length(strStream));
     memStream.Position := 0;
     jpegimg.LoadFromStream(memStream); //<-- err #53
     JvImage1.Picture.Assign(jpegimg);
   finally
     memStream.Free;
     jpegimg.Free;
   end;

ho modificato come segue,
con url 1 l'immagine viene caricata (server Altervista)
con url 2 ottengo errore
EIdHttpProtocolException HTTP/1.1.30 Moved Permanently
(Server Aruba)
 
per questo errore EIdHttpProtocolException ci sono rimedi ?
 
//funzionante con url altervista
//problemi protocollo con Aruba
procedure Tfrm_AccessoRemoto.Button1Click(Sender: TObject);
var
   strStream, url: String;
   memStream: TMemoryStream;
   jpegimg: TJPEGImage;
   Image: TJvImage;
   wic: TWICImage;
 
begin
   try
    memStream := TMemoryStream.Create;
    memStream.Clear;
 
    //url := '
http://efalco.it/Foto/G510/IMG_20131225_193709.jpg
';  //#1
    url := '
http://maverich.altervista.org/download/IMG_2225.JPG
';  //#2
    idhttp1.Get (url, memstream);
 
    wic := TWICImage.Create;
    memStream.Position:=0;
    wic.LoadFromStream(memStream);
    JvImage1.Picture.Assign(wic);
 
    except
      ShowMessage('Immagine non trovata');
    end;
end;

dimenticato la riga dove solleva eccezione
 
idhttp1.Get (url, memstream);
 
 

 [...]
 
Sembrerebbe trattarsi di un *redirect*.
 
Cattura l'indirizzo presente nella risposta del server e fai l'interrogazione a quell'URL per ottenere l'immagine.
 
Tieni conto che alcune CDN (Content Delivery Network) bloccano l'accesso a client "sconosciuti" o diversi dal browser, o che non arrivano da una pagina specifica di origine.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
 #Home: 
http://www.marco.breveglieri.name
 
 #Blog: 
http://www.compilaquindiva.com
 
 #DelphiPodcast: 
http://www.delphipodcast.com
 

prova questo 
 
procedure scaricaimg(url:string;immagine:TJVImage);
var tm:TMemoryStream;
id:THttpClient;
begin
tm := TMemoryStream.Create;
id:= THTTPClient.Create;
try
id.Get(url,tm);
tm.Position:=0;
immagine.LoadFromStream(tm);
finally
  tm.Free;
end;
end; 
 
per usarlo basta fare scaricaimg('url link' o edit.text come vuoi,e l'immagine che assegni) 
 
ho cambiato un pò il codice ho usato nethttpclient che supporta sia il redirect come giustamente aveva notato marco che il protocollo https oltre a quello standard. E citando M.Breviglieri: "Se compila va!" ;)

>
 
grazie dell'aiuto.
da XE8 ho usato NetHttpClient (palette Net)
carica un'immagine da server Aruba senza autenticazione
 
procedure TForm2.LoadImg(url: string);
var tm:TMemoryStream;
     id:TNetHttpClient;
     jpeg: TJpegImage;
begin
   tm := TMemoryStream.Create;
   id:= TNetHTTPClient.Create;
   jpeg := TJpegImage.Create;
 
  try
   id.Get(url,tm);
   tm.Position:=0;
   jpeg.LoadFromStream(tm);
   immagine.Picture.Assign(jpeg);  //TImage
  finally
   tm.Free;
   id.Free;
   jpeg.Free;
  end;
 
end

ho usato dichiarato come vuoi direttamente l'unit in uses senza inserire il componente, System.Net.HttpClient funzione o stesse!