You will need to work with the Status event, capturing data read and then
deciding a threshold to flush the buffer to a file and clear it

I made a custom class/wrapper for this

Type
   TOnReceiveData = procedure(Len,Max: Int64) of object;

Var
    DownloadSize: Int64;
    xOnReceiveData: TOnReceiveData;

Type TSynHTTP = class(TObject)

Sock.OnStatus  := Status;

//Callback function for status events
procedure TSynHTTP.Status(Sender: TObject; Reason: THookSocketReason; const
Value: String; const ValueInt: Int64);
Var V, currentHeader: String;
    i: integer;
  function GetSizeFromHeader(Header: String): integer;
  Var item: TStringList;
  begin
    //the download size is contained in the header (e.g.: Content-Length:
3737722)
    Result := -1;

    if Pos('Content-Length:', Header) <> 0 then begin
      item := TStringList.Create();
      item.Delimiter := ':';
      item.StrictDelimiter :=true;
      item.DelimitedText   :=Header;
      if item.Count = 2 then begin
        Result:= StrToInt(Trim(item[1]));
      end;
    end;
  end;
begin
  //try to get filesize from headers
  if Assigned(xOnReceiveData) then
  if (DownloadSize < 1) then begin
    for i := 0 to hSock.Headers.Count - 1 do begin
      currentHeader := hSock.Headers[i];
      DownloadSize  := GetSizeFromHeader(currentHeader);
      if DownloadSize <> -1 then break;
    end;
  end;

  //HR_ReadCount contains the number of bytes since the last event
  if Reason = THookSocketReason.HR_WriteCount then begin
    if Assigned(xOnSendData) then xOnSendData(ValueInt);
  end;
  if DownloadSize > 0 then
  if Reason = THookSocketReason.HR_ReadCount then begin
    if Assigned(xOnReceiveData) then xOnReceiveData(ValueInt,DownloadSize);
  end;
end;

So with this you will get a trigger as received data piles up, ValueInt =
amount of data received on this trigger, let's say 8 KB, then you capture
the event and sum up until you reach something like 50 MB, then write to a
file and clear the HTTPSend.Document stream, repeat until download is
finished.

On 23 January 2017 at 17:45, Rainer Backes <rbac...@bond.de> wrote:

> Hi,
>
> I would need a function/method to download a file via http/https directly
> to disk, without using the memory stream inside the THTTPSend class - the
> files that I have to download can be quite large (some GBs). Does anyone
> already have such a function ?
>
> Thanks
>
> Rainer
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, SlashDot.org! http://sdm.link/slashdot
> _______________________________________________
> synalist-public mailing list
> synalist-public@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/synalist-public
>
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
synalist-public mailing list
synalist-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/synalist-public

Reply via email to