У меня получился такой вариант
Вот главный кусок, который отвечает за отображение веб-страниц, либо отдачу файла
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
procedure TfHTTPServer.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var filepath: string; IsWebPage: Boolean; WebPageContent: string; begin //...some code //Preparing file for download if it is on the Server begin if FHTTPServerCommandGet.IsFileOnServer(ARequestInfo.URI,filepath,IsWebPage,WebPageContent) then begin AResponseInfo.ResponseNo := 200; if IsWebPage then AResponseInfo.ContentText:=WebPageContent else AResponseInfo.ServeFile(AContext, filepath); end else AresponseInfo.ResponseNo := 404; end; end; |
В отдельном модуле метод проверки наличия файла на сервере
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
function THTTPServerCommandGet.IsFileOnServer (uri: string; var filepath:string; IsWebPage:boolean; var WebPageContent:string): Boolean; var AppPath:String; uriWinSlash: string; Extension: string; WebPageContentSL:TStringList; begin Result:=false; WebPageContentSL:=TStringList.Create; //----------- we have URI, lets build normal windows dir AppPath:=ExtractFilePath(Application.ExeName); uriWinSlash:=StringReplace(uri,'//','',[rfReplaceAll]); uriWinSlash:=StringReplace(uriWinSlash,'/','\',[rfReplaceAll]); filepath:=AppPath+uriWinSlash; if TFile.Exists(filepath) then begin Extension:=ExtractFileExt(filepath); if (Extension='.html') or (Extension='.html') then begin IsWebPage:=true; WebPageContentSL.LoadFromFile(filepath); WebPageContent:=WebPageContentSL.Text; end; Result:=true; end; FreeAndNil(WebPageContentSL); end; |
Тестируем