![]() |
|
|
|
|
#1
|
||||
|
||||
|
как отправить файл клиенту?? ну например я создал сервер и обрабатываю входящие запросы:
Код:
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;
Чуть не забыл, иконка передастся автоматом, у меня работает, пробовал на опере, файрфоксе. |
|
#3
|
||||
|
||||
|
тут еще глянь http://www.delphigroups.info/2/11/207358.html
|
|
#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. |