TsgcWebSocketServer_HTTPAPI | Send File Response

HTTP 요청에 대한 응답으로 파일을 보내려면 THttpServerResponse 객체의 FileName 속성을 사용하십시오.

 


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;

Resumable Downloads

HTTP 206 Partial Content 응답은 전체 파일을 보내는 대신 서버가 리소스의 특정 부분(범위)에 대한 요청을 이행할 때 사용됩니다. 이는 일반적으로 재개 가능한 다운로드, 미디어 스트리밍, 대용량 파일 전송에 사용됩니다.

작동 방식:

 

클라이언트가 부분 리소스를 요청함: 클라이언트(브라우저, 다운로더 또는 미디어 플레이어)는 원하는 바이트 범위를 지정하는 Range 헤더를 보냅니다. 요청 예:

 

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

 

이것은 video.mp4의 1000~5000 바이트를 요청합니다.

 

서버가 HTTP 206으로 응답: 서버가 범위 요청을 지원하면 206 Partial Content로 응답하고 Content-Range 헤더를 포함합니다. 예제 응답:

 

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

 

Content-Range 헤더는 다음을 보여줍니다:

 

제공되는 범위(1000-5000)

파일의 총 크기(1000000바이트)입니다.

Content-Length 헤더는 반환된 부분의 크기입니다(4001바이트).

 

Client Can Request More Chunks:

클라이언트는 서로 다른 부분에 대해 여러 요청을 보낼 수 있습니다.

이는 재개 가능한 다운로드와 효율적인 스트리밍을 가능하게 합니다.

 


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;