Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отсылка файла с IdHttpServer [D6, WinXP]


zdx 200 ©   (2004-12-02 12:21:00) 

Уважаемые Мастера! При отправке файла с помощью TIaHttpServer.ServeFile получается,
что IE сохраняет этот файл по имени ссылки, которой он запрашивается. Как передать реальное имя фала если оно отличается от имени  ссылки


Slym   (2004-12-03 04:44:00) [1]

Замена ServeFile с поддержкой докачки! :)

unit ServFileEx;

interface
uses Windows,Classes,SysUtils,IdTCPServer,IdCustomHTTPServer;

procedure ServeFileEx(const FileName:string;AThread: TIdPeerThread;RequestInfo:TIdHTTPRequestInfo;ResponseInfo: TIdHTTPResponseInfo);

implementation
uses IdGlobal;
var IdMimeTable:TIdMimeTable=nil;

procedure ServeFileEx(const FileName:string;AThread: TIdPeerThread;RequestInfo:TIdHTTPRequestInfo;ResponseInfo: TIdHTTPResponseInfo);
var FileStream:TFileStream;
begin
 try
   FileStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
   try
     try
       FileStream.Position:=RequestInfo.ContentRangeStart;
     except
       on ERangeError do
       begin
         RequestInfo.ContentRangeStart:=FileStream.Position;
         RequestInfo.ContentRangeEnd:=0;
       end;
     end;
     if RequestInfo.ContentRangeEnd=0 then
       RequestInfo.ContentRangeEnd:=FileStream.Size;
     RequestInfo.ContentLength:=RequestInfo.ContentRangeEnd-RequestInfo.ContentRangeStart;
     if FileStream.Size=RequestInfo.ContentLength then
       ResponseInfo.ResponseNo:=200
     else
       ResponseInfo.ResponseNo:=206;

     ResponseInfo.ContentType:=IdMimeTable.GetFileMIMEType(FileName);
     ResponseInfo.ContentLength:=RequestInfo.ContentLength;
     ResponseInfo.CustomHeaders.Clear;
     ResponseInfo.CustomHeaders.Values['Accept-Ranges']:='bytes';
     ResponseInfo.CustomHeaders.Values['Content-Disposition']:='filename="'+ExtractFileName(FileName)+'"';

     ResponseInfo.WriteHeader;
     if not AnsiSameText(RequestInfo.Command,'HEAD') then
       AThread.Connection.WriteStream(FileStream,false,false,ResponseInfo.ContentLength);
   finally
     FileStream.Free;
   end;
 except
   on EFOpenError do Abort;
 end;
end;

initialization
 IdMimeTable:=TIdMimeTable.Create(true);
finalization
 if assigned(IdMimeTable) then
   FreeAndNil(IdMimeTable);
end.


Slym   (2004-12-03 04:44:00) [2]

Замена ServeFile с поддержкой докачки! :)

unit ServFileEx;

interface
uses Windows,Classes,SysUtils,IdTCPServer,IdCustomHTTPServer;

procedure ServeFileEx(const FileName:string;AThread: TIdPeerThread;RequestInfo:TIdHTTPRequestInfo;ResponseInfo: TIdHTTPResponseInfo);

implementation
uses IdGlobal;
var IdMimeTable:TIdMimeTable=nil;

procedure ServeFileEx(const FileName:string;AThread: TIdPeerThread;RequestInfo:TIdHTTPRequestInfo;ResponseInfo: TIdHTTPResponseInfo);
var FileStream:TFileStream;
begin
 try
   FileStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
   try
     try
       FileStream.Position:=RequestInfo.ContentRangeStart;
     except
       on ERangeError do
       begin
         RequestInfo.ContentRangeStart:=FileStream.Position;
         RequestInfo.ContentRangeEnd:=0;
       end;
     end;
     if RequestInfo.ContentRangeEnd=0 then
       RequestInfo.ContentRangeEnd:=FileStream.Size;
     RequestInfo.ContentLength:=RequestInfo.ContentRangeEnd-RequestInfo.ContentRangeStart;
     if FileStream.Size=RequestInfo.ContentLength then
       ResponseInfo.ResponseNo:=200
     else
       ResponseInfo.ResponseNo:=206;

     ResponseInfo.ContentType:=IdMimeTable.GetFileMIMEType(FileName);
     ResponseInfo.ContentLength:=RequestInfo.ContentLength;
     ResponseInfo.CustomHeaders.Clear;
     ResponseInfo.CustomHeaders.Values['Accept-Ranges']:='bytes';
     ResponseInfo.CustomHeaders.Values['Content-Disposition']:='filename="'+ExtractFileName(FileName)+'"';

     ResponseInfo.WriteHeader;
     if not AnsiSameText(RequestInfo.Command,'HEAD') then
       AThread.Connection.WriteStream(FileStream,false,false,ResponseInfo.ContentLength);
   finally
     FileStream.Free;
   end;
 except
   on EFOpenError do Abort;
 end;
end;

initialization
 IdMimeTable:=TIdMimeTable.Create(true);
finalization
 if assigned(IdMimeTable) then
   FreeAndNil(IdMimeTable);
end.


Наверх

Титульная страница Поиск, карта сайта Написать письмо