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