Use a propriedade FileName do objeto THttpServerResponse se você quiser enviar um arquivo como resposta a uma requisição 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;
Uma resposta HTTP 206 Partial Content é utilizada quando um servidor está atendendo a uma requisição de uma porção específica (intervalo) de um recurso, em vez de enviar o arquivo inteiro. Isso é comumente utilizado para downloads que podem ser retomados, streaming de mídia e transferências de arquivos grandes.
Como funciona:
O Cliente Solicita um Recurso Parcial: O cliente (navegador, downloader ou media player) envia um cabeçalho Range especificando o intervalo de bytes que deseja. Exemplo de requisição:
GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-5000
Isto requisita os bytes 1000 a 5000 de video.mp4.
Servidor Responde com HTTP 206: Se o servidor suportar requisições de range, ele responde com 206 Partial Content e inclui um cabeçalho Content-Range. Exemplo de resposta:
HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-5000/1000000
Content-Length: 4001
Content-Type: video/mp4
O cabeçalho Content-Range mostra:
O intervalo servido (1000-5000)
O tamanho total do arquivo (1000000 bytes).
O cabeçalho Content-Length é o tamanho da porção retornada (4001 bytes).
O Cliente Pode Solicitar Mais Chunks:
O cliente pode enviar múltiplas requisições para partes diferentes.
Isto habilita downloads retomáveis e streaming eficiente.
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;