|
#1
|
||||
|
||||
IdHTTPServer
как отправить файл клиенту?? ну например я создал сервер и обрабатываю входящие запросы:
Код:
procedure TForm1.HTTPCommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var str:string; st:TStringList; begin str:=StringReplace(arequestinfo.document,'/','\',[rfReplaceAll]); Delete(str,1,1); if FileExists(ExtractFilePath(Application.ExeName)+str) then begin st:=TStringList.Create; st.LoadFromFile(ExtractFilePath(Application.ExeName)+str); AResponseInfo.ContentText:= st.Text; st.free; end; if ExtractFileName(ExtractFilePath(Application.ExeName)+str)='favicon.ico' then begin // // здесь как то надо отправить файл favicon.ico серверу. но как ??? // end; memo1.lines.add(ExtractFilePath(Application.ExeName)+str); end; |
#2
|
||||
|
||||
Лично я сделал так:
Код:
procedure TwndMain.ServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var aFilename: string; DataStream:TMemoryStream; function NormalFileName(fName:string):string; var s:string; begin s := WorkPath + fName; s := StringReplace(s,'/','\',[rfReplaceAll]); Result := s; end; begin _requests := _requests+(Format('Client %s:%d trying to "%s" request on "%s" document at %s',[ AContext.Binding.PeerIP, AContext.Binding.PeerPort, ARequestInfo.Command, ARequestInfo.Document, FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]))+#13#10; //для ведения журнала if ARequestInfo.Command <> 'GET' then begin _messages := _messages+(Format('Client %s:%d used "%s" request at %s',[ AContext.Binding.PeerIP, AContext.Binding.PeerPort, ARequestInfo.Command, FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]))+#13#10;// для ведения журнала AResponseInfo.ResponseNo := 501; // 501 ошибка aFilename := NormalFileName('/501.htm'); AResponseInfo.ContentType := GenContType(aFilename); AResponseInfo.ContentStream := TFileStream.Create(aFileName,fmShareDenyNone); Exit; end; if ARequestInfo.Document = '/' then ARequestInfo.Document := ARequestInfo.Document + 'index.htm'; aFilename := NormalFileName(ARequestInfo.Document); if FileExists(aFilename) then begin AResponseInfo.ContentType := GenContType(aFilename); // определяет тип содержимого по расширению запрашиваемого файла *.htm == text/html *.txt == text/plain ну и так далее AResponseInfo.ResponseNo := 200;// все успешно AResponseInfo.ContentStream := TFileStream.Create(aFileName,fmShareDenyNone); Exit; end; _messages := _messages+(Format('Client %s:%d trying to get nonexistent file "%s" at %s',[ AContext.Binding.PeerIP, AContext.Binding.PeerPort, ARequestInfo.Document, FormatDateTime('yyyy/mm/dd hh:mm:ss', Now)]))+#13#10; aFilename := NormalFileName('/404.htm');//выдаем 404 ошибку AResponseInfo.ContentType := GenContType(aFilename); AResponseInfo.ResponseNo := 404; AResponseInfo.ContentStream := TFileStream.Create(aFileName,fmShareDenyNone); end; Чуть не забыл, иконка передастся автоматом, у меня работает, пробовал на опере, файрфоксе. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
тут еще глянь http://www.delphigroups.info/2/11/207358.html
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
||||
|
||||
Код:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); begin //INDEX if (ARequestInfo.Document='') or (ARequestInfo.Document='/') then begin AResponseInfo.ContentType:='text/html'; IdHTTPServer1.ServeFile(AThread, AResponseinfo,Edit2.Text+'\'+Edit1.Text) end else //ERROR 404 if (ARequestInfo.Document<>'') or (ARequestInfo.Document<>'/') then if fileexists(Edit2.Text+'\'+ARequestInfo.Document)=false then IdHTTPServer1.ServeFile(AThread, AResponseinfo,Edit2.Text+'\'+Edit3.Text) else //CONTENT TYPE begin if Pos('.GIF',ANSIUPPERCASE(ARequestInfo.Document))>0 then AResponseInfo.ContentType:='image/gif' else if Pos('.JPG',ANSIUPPERCASE(ARequestInfo.Document))>0 then AResponseInfo.ContentType:='image/jpg' else if Pos('.JPEG',ANSIUPPERCASE(ARequestInfo.Document))>0 then AResponseInfo.ContentType:='image/jpeg' else if Pos('.BMP',ANSIUPPERCASE(ARequestInfo.Document))>0 then AResponseInfo.ContentType:='image/bmp' else if Pos('.PNG',ANSIUPPERCASE(ARequestInfo.Document))>0 then AResponseInfo.ContentType:='image/png' else if (Pos('.HTML',ANSIUPPERCASE(ARequestInfo.Document))>0) or (Pos('.HTM',ANSIUPPERCASE(ARequestInfo.Document))>0) or (Pos('.PHP',ANSIUPPERCASE(ARequestInfo.Document))>0) or (Pos('.CSS',ANSIUPPERCASE(ARequestInfo.Document))>0) or (Pos('.TXT',ANSIUPPERCASE(ARequestInfo.Document))>0) or (Pos('.XML',ANSIUPPERCASE(ARequestInfo.Document))>0) or (Pos('.JS',ANSIUPPERCASE(ARequestInfo.Document))>0) then AResponseInfo.ContentType:='text/html' else AResponseInfo.ContentType:='application/octet-stream'; IdHTTPServer1.ServeFile(AThread, AResponseinfo,Edit2.Text+'\'+ARequestInfo.Document); end; Edit2 - это путь главного каталога. Edit1 - это главный файл (index.htm, index.php). Edit3 - это файл ошибки 404. |