Należy użyć właściwości FileName obiektu THttpServerResponse, jeśli chcemy wysłać plik jako odpowiedź na żądanie HTTP.
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;
Odpowiedź HTTP 206 Partial Content jest używana, gdy serwer realizuje żądanie dotyczące określonego fragmentu (zakresu) zasobu, zamiast przesyłać cały plik. Jest to powszechnie stosowane przy wznawianych pobieraniach, strumieniowaniu multimediów oraz przesyłaniu dużych plików.
Jak to działa:
Klient żąda częściowego zasobu: Klient (przeglądarka, program pobierający lub odtwarzacz multimediów) wysyła nagłówek Range określający żądany zakres bajtów. Przykładowe żądanie:
GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-5000
To żądanie pobiera bajty od 1000 do 5000 pliku video.mp4.
Serwer odpowiada kodem HTTP 206: Jeśli serwer obsługuje żądania zakresowe, odpowiada kodem 206 Partial Content i dołącza nagłówek Content-Range. Przykładowa odpowiedź:
HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-5000/1000000
Content-Length: 4001
Content-Type: video/mp4
Nagłówek Content-Range pokazuje:
Obsługiwany zakres (1000–5000)
Całkowity rozmiar pliku (1 000 000 bajtów).
Nagłówek Content-Length zawiera rozmiar zwróconej części (4001 bajtów).
Klient może żądać kolejnych fragmentów:
Klient może wysyłać wiele żądań dotyczących różnych części.
Umożliwia to wznawialne pobieranie i wydajne strumieniowanie.
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;