TsgcWebSocketServer_HTTPAPI | Wysyłanie odpowiedzi z plikiem

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;

Wznawiane pobieranie plików

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;