Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Bilder herunterladen (https://www.delphipraxis.net/119391-bilder-herunterladen.html)

capo 25. Aug 2008 20:56


Bilder herunterladen
 
Hallo,
ich muss auf einem Server Bilder herunterladen.
In der ersten Zeile eines Stringgrids stehen untereinander die Bildnamen:
Zitat:

5710805.jpg
4126554.jpg
4122607.jpg
4120161.jpg
4120149.jpg
4120138.jpg
4118747.jpg
4118656.jpg
4112252.jpg
4112241.jpg
4126554.jpg
Ich verwende folgendes Beispiel:
Delphi-Quellcode:
function GetFile(const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: string;
begin
 Result:=False;
 sAppName := ExtractFileName(Application.ExeName);
 hSession := InternetOpen(PChar(sAppName),
                INTERNET_OPEN_TYPE_PRECONFIG,
               nil, nil, 0);
 try
  hURL := InternetOpenURL(hSession,
            PChar(fileURL),
            nil,0,0,0);
  try
   AssignFile(f, FileName);
   Rewrite(f,1);
   repeat
    InternetReadFile(hURL, @Buffer,
                     SizeOf(Buffer), BufferLen);
    BlockWrite(f, Buffer, BufferLen)
   until BufferLen = 0;
   CloseFile(f);
   Result:=True;
  finally
   InternetCloseHandle(hURL)
  end
 finally
  InternetCloseHandle(hSession)
 end
end;
Das klappt auch soweit, ist nur mega langsam.
Ich mache das so:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i, ib :integer;
begin
for i := 1 to StringGrid1.RowCount - 1 do
  begin
    if stringgrid1.GetCheckBoxState(0, i, state) then
    begin
      if state = true then
     Memo1.Lines.add(Stringgrid1.Cells[1, i]);
     for ib := 0 to memo1.lines.count - 1 do
  begin

GetFile('http://server/bilder/'+ memo1.lines.strings[ib]+ '.jpg','C:\temp\'+ memo1.lines.strings[ib]+ '.jpg');
    end;
  end;
 end;
end;
Gibt es eine schnellere Methode wie ich die Bilder downloaden kann?

Grüße
Capo

fkerber 25. Aug 2008 21:21

Re: Bilder herunterladen
 
Hi!

Vllt. kommst du hiermit schneller zum gewünschten Erfolg:
http://www.delphipraxis.net/internal...downloadtofile


Ciao, Frederic

capo 25. Aug 2008 21:23

Re: Bilder herunterladen
 
Hallo Frederic,

nein, das ist vom Prinzip her das gleiche.
Hatte ich auch schon gesehen.
Dankeschön für deine Antwort.

Vito

djpaull 2. Sep 2008 10:25

Re: Bilder herunterladen
 
Ich weiss nicht, ob dich das weiter bringt, aber ... Hier ist von meinem Browser. K.A woher ich den hab.

Delphi-Quellcode:
procedure tform1.DL; // Hier Startet man den Download
var
  Savedir,Webdir,Filename,Fileext: String;
  url,ziehl: pchar;
  cDownStatus : cDownloadStatusCallback;
  x,y:integer;
begin
  abort:=false;
  x:=0;
  y:=1;
  cDownStatus := cDownloadStatusCallBack.Create;
  Savedir:=edt1.Text;
  //createdir(ziehl);
  //edt2.Text:=ziehl;
  for i := 0 to Listbox2.items.Count - 1 do //listbox ist die Liste mit bildern
  if abort=false then
  begin
    Application.ProcessMessages;
    url:=pchar(listbox2.Items.Strings[i]);


    //Webdir:=getcurrentwb.LocationName;
    Filename:=ExtractURLPath(listbox2.Items.Strings[i]);
    Fileext:=extractfileext(listbox2.Items.Strings[i]);
    ziehl:=pchar(Savedir + '\' + filename{+ inttostr(i+1)'\' + webdir +  + '.' }+ fileext);
    edt2.Text:=ziehl;
    URLDownloadToFile(nil, url, ziehl, 0 , CDownStatus);
    x:=x+1;
    statusbar1.Panels[3].Text:=inttostr(x)+' Datei(en) Runtergeladen';
    progressbar2.Position:=y;
    y:=y+1;
    edt2.Clear;
  end
  else
  break;
end;

// Das muss auch noch rein
// Frag mich nicht was was ist :-)

function cDownloadStatusCallback._AddRef: Integer;
begin
  Result := 0;
end;

function cDownloadStatusCallback._Release: Integer;
begin
  Result := 0;
end;

function cDownloadStatusCallback.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if(GetInterface(IID,Obj)) then
  begin
    Result := 0
  end else
  begin
    Result := E_NOINTERFACE;
  end;
end;

function cDownloadStatusCallback.OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.GetPriority(out nPriority): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnLowResource(reserved: DWORD): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin
  case ulStatusCode of
    BINDSTATUS_FINDINGRESOURCE:
    begin
      form1.StatusBar1.Panels[2].Text := 'Datei wurde gefunden...';
      if (usercancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_CONNECTING:
    begin
      form1.StatusBar1.Panels[2].Text := 'Es wird verbunden...';
      if (usercancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_BEGINDOWNLOADDATA:
    begin
      Form1.progressbar1.Position := 0;
      form1.ProgressBar2.Max:=form1.ListBox2.Items.Count;
      //Form1.progressbar2.Position := 0;
      form1.StatusBar1.Panels[2].Text := 'Der Download wurde gestartet...';
      if (UserCancel) then
      begin
        Result := E_ABORT;
        exit;
      end;
    end;
    BINDSTATUS_DOWNLOADINGDATA:
    begin
      Form1.progressbar1.Position := MulDiv(ulProgress,100,ulProgressMax);
      //form1.ProgressBar2.Position := MulDiv(ulProgress,100,ulProgressMax);
      form1.StatusBar1.Panels[2].Text := 'Datei wird heruntergeladen...';
      if (UserCancel) then
      begin
        Result := E_ABORT; exit;
      end;
    end;
    BINDSTATUS_ENDDOWNLOADDATA:
    begin
      form1.StatusBar1.Panels[2].Text := 'Download wurde beendet...';
    end;
  end;
  Application.ProcessMessages;

  Result := S_OK;
end;
Aufrufen kann man sie so
Delphi-Quellcode:
procedure TForm2.ButtonDLClick(Sender: TObject);
begin
DL;
end;
Ich hoffe, das hilft jemandem.

capo 2. Sep 2008 10:28

Re: Bilder herunterladen
 
Suupi, ich werd damit mal rumtesten. Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz