Verwenden Sie die Eigenschaft FileName des THttpServerResponse-Objekts, wenn Sie eine Datei als Antwort auf eine HTTP-Anforderung senden möchten.
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;
Eine HTTP-206-Partial-Content-Antwort wird verwendet, wenn ein Server eine Anfrage für einen bestimmten Teil (Bereich) einer Ressource erfüllt, anstatt die gesamte Datei zu senden. Dies wird häufig für fortsetzbare Downloads, Medien-Streaming und große Dateiübertragungen verwendet.
Wie es funktioniert:
Client fordert eine Teilressource an: Der Client (Browser, Downloader oder Media-Player) sendet einen Range-Header, der den gewünschten Byte-Bereich angibt. Beispielanfrage:
GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-5000
Dies fordert die Bytes 1000 bis 5000 von video.mp4 an.
Server antwortet mit HTTP 206: Wenn der Server Range-Requests unterstützt, antwortet er mit 206 Partial Content und enthält einen Content-Range-Header. Beispielantwort:
HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-5000/1000000
Content-Length: 4001
Content-Type: video/mp4
Der Content-Range-Header zeigt:
Der bediente Bereich (1000-5000)
Die Gesamtgröße der Datei (1000000 Bytes).
Der Content-Length-Header ist die Größe des zurückgegebenen Abschnitts (4001 Bytes).
Client kann weitere Chunks anfordern:
Der Client kann mehrere Anfragen für verschiedene Teile senden.
Dies ermöglicht fortsetzbare Downloads und effizientes Streaming.
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;