TsgcWebSocketServer_HTTPAPI | Send File Response

Bir HTTP isteğine yanıt olarak bir dosya göndermek istiyorsanız, THttpServerResponse nesnesinin FileName özelliğini kullanın.

 


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;

Devam Ettirilebilir İndirmeler

HTTP 206 Partial Content yanıtı, bir sunucunun tüm dosyayı göndermek yerine bir kaynağın belirli bir bölümü (aralığı) için bir isteği karşıladığında kullanılır. Bu, genellikle devam ettirilebilir indirmeler, medya stream'leme ve büyük dosya aktarımları için kullanılır.

Nasıl çalışır:

 

İstemci Kısmi Bir Kaynak İster: İstemci (tarayıcı, indirici veya ortam oynatıcı), istediği bayt aralığını belirten bir Range başlığı gönderir. Örnek istek:

 

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

 

Bu, video.mp4'ün 1000 ile 5000 arasındaki baytlarını ister.

 

Sunucu HTTP 206 ile Yanıt Verir: Sunucu aralık isteklerini destekliyorsa, 206 Partial Content ile yanıt verir ve bir Content-Range başlığı içerir. Örnek yanıt:

 

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

 

Content-Range başlığı şunu gösterir:

 

Sunulan aralık (1000-5000)

Dosyanın toplam boyutu (1000000 bayt).

Content-Length başlığı, döndürülen bölümün boyutudur (4001 bayt).

 

İstemci Daha Fazla Parça (Chunk) İsteyebilir:

İstemci farklı parçalar için birden çok istek gönderebilir.

Bu, devam ettirilebilir indirmeleri ve verimli akışı etkinleştirir.

 


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;