Utilisez la propriété FileName de l'objet THttpServerResponse si vous souhaitez envoyer un fichier en réponse à une requête 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;
Une réponse HTTP 206 Contenu partiel est utilisée lorsqu'un serveur répond à une demande concernant une portion spécifique (plage) d'une ressource, au lieu d'envoyer le fichier entier. Ceci est couramment utilisé pour les téléchargements reprenables, la diffusion multimédia et les transferts de fichiers volumineux.
Fonctionnement :
Le client demande une ressource partielle : Le client (navigateur, téléchargeur ou lecteur multimédia) envoie un en-tête Range spécifiant la plage d'octets souhaitée. Exemple de requête :
GET /video.mp4 HTTP/1.1
Host: example.com
Range: bytes=1000-5000
Cette requête demande les octets 1000 à 5000 de video.mp4.
Le serveur répond avec HTTP 206 : Si le serveur prend en charge les requêtes de plage, il répond avec 206 Partial Content et inclut un en-tête Content-Range. Exemple de réponse :
HTTP/1.1 206 Partial Content
Content-Range: bytes 1000-5000/1000000
Content-Length: 4001
Content-Type: video/mp4
L'en-tête Content-Range affiche :
La plage servie (1000-5000)
La taille totale du fichier (1 000 000 octets).
L'en-tête Content-Length correspond à la taille de la portion retournée (4001 octets).
Le client peut demander plus de morceaux :
Le client peut envoyer plusieurs requêtes pour différentes parties.
Cela permet des téléchargements reprenables et un streaming efficace.
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;