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;
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;