TsgcWebSocketServer_HTTPAPI | Bestandsrespons verzenden

Gebruik de eigenschap FileName van het THttpServerResponse-object als u een bestand als reactie op een HTTP-verzoek wilt verzenden.

 


procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI; 
	const aRequestInfo: THttpServerRequest; 
	var aResponseInfo: THttpServerResponse);
begin
  if aRequestInfo.Method = 'GET' then
  begin
    if aRequestInfo.Document = '/test.zip' then
	begin
	  aResponseInfo.ResponseNo := 200;
	  aResponseInfo.FileName := 'c:\download\test.zip';
	  aResponseInfo.ContentType := 'application/zip';
	end
	else
	  aResponseInfo.ResponseNo := 404;
  end
  else 
    aResponseInfo.ResponseNo := 500;
end;

Hervat bare Downloads

Een HTTP 206 Partial Content-respons wordt gebruikt wanneer een server een verzoek voor een specifiek gedeelte (bereik) van een resource vervult, in plaats van het volledige bestand te verzenden. Dit wordt vaak gebruikt voor hervattbare downloads, mediastreaming en grote bestandsoverdrachten.

Hoe het werkt:

 

Client vraagt een gedeeltelijke resource aan: De client (browser, downloader of mediaspeler) verzendt een Range-header die het gewenste bytebereik aangeeft. Voorbeeldverzoek:

 

GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-5000

 

Dit verzoekt bytes 1000 tot 5000 van video.mp4.

 

Server reageert met HTTP 206: Als de server bereikverzoeken ondersteunt, reageert hij met 206 Partial Content en voegt een Content-Range-header toe. Voorbeeldreactie:

 

HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-5000/1000000
Content-Length: 4001
Content-Type: video/mp4

 

De Content-Range-header toont:

 

Het bediende bereik (1000-5000)

De totale grootte van het bestand (1000000 bytes).

De Content-Length-header is de grootte van het geretourneerde gedeelte (4001 bytes).

 

Client kan meer fragmenten opvragen:

De client kan meerdere verzoeken indienen voor verschillende onderdelen.

Dit maakt hervattbare downloads en efficiënt streamen mogelijk.

 


procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI;
const aRequestInfo: THttpServerRequest; var aResponseInfo: THttpServerResponse);
var
  oStream: TFileStream;
  oRanges: TIdEntityRanges;
begin
  oStream := TFileStream.Create('test.pdf', fmOpenRead);
  oRanges := TIdEntityRanges.Create(nil);
  Try
    oRanges.Text := aRequestInfo.Range;
    aResponseInfo.ContentType := 'application/pdf';
    if oRanges.Count > 0 then
    begin
      aResponseInfo.ResponseNo := 206;
      aResponseInfo.AcceptRanges := 'bytes';
      aResponseInfo.ContentRangeStart := oRanges[0].StartPos;
      aResponseInfo.ContentRangeEnd := oRanges[0].EndPos;
      aResponseInfo.ContentRangeInstanceLength := oStream.Size;
      aResponseInfo.ContentStream := TIdHTTPRangeStream.Create(oStream,
        aResponseInfo.ContentRangeStart, aResponseInfo.ContentRangeEnd);
    end
    else
    begin
      aResponseInfo.ResponseNo := 200;
      aResponseInfo.ContentStream := oStream;
    end;
  Finally
    oRanges.Free;
  End;
end;