Конференция "Сети" » IdHTTPServer indy 9 и файл больше 10 Мб? [D7, WinXP]
 
  • denissoft (12.01.11 18:50) [0]
    Пишу веб сервер на базе  delphi 7 indy 9. возникла проблема
    1. докачки файла при разрыве связи.
    2. при скачивании большого файла - более 8 Мб связь обрывается.
    в чем может быть проблема


     if fileage(form1.Edit1.text+'\'+ARequestInfo.Document)>0 then begin
      AResponseInfo.ContentType := 'application/octet-stream';

      form1.IdHTTPServer1.ServeFile( AThread, aResponseInfo,   form1.Edit1.text+'\'+ARequestInfo.Document);

  • denissoft (12.01.11 19:30) [1]
    2 вопрос решон - обрыв происходил при запуске ПО под виртуальной машиной при запуске в нормальном режиме все ок.

    как сделать возможность докачивать файлы?
  • Сергей М. © (12.01.11 22:36) [2]

    > вопрос решон .. обрыв при запуске ..под виртуальной машиной


    Даже если потеряное нашлось под столбом с фонарем, это не значит что именно под столбом оно было потеряно.
  • Slym © (13.01.11 08:37) [3]
    denissoft   (12.01.11 19:30) [1]
    код старый так что допиливай сам...

    procedure ServeFileEx(const FileName:string;Context: TIdContext;RequestInfo:TIdHTTPRequestInfo;ResponseInfo: TIdHTTPResponseInfo);
    var
     FileStream:TFileStream;
     FileTime: TFileTime;
     DosFileTime:integer;
     FileDate,ReqDate:TDateTime;
     Stream:TIdStreamVCL;
    begin
     try
       FileStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
       try
         //Used GMT date
         if not GetFileTime(FileStream.Handle,nil,nil,@FileTime) then RaiseLastOSError;
         if not FileTimeToDosDateTime(FileTime,LongRec(DosFileTime).Hi, LongRec(DosFileTime).Lo) then RaiseLastOSError;
         FileDate := FileDateToDateTime(DosFileTime);

         //Check not modified
         ReqDate := StrInternetToDateTime(RequestInfo.RawHeaders.Values['If-Modified-Since']);
         if (ReqDate <> 0) and (abs(ReqDate-FileDate)<2*(1/(24*60*60))) then
         begin
           ResponseInfo.ResponseNo := 304;
           ResponseInfo.WriteHeader;
           exit;
         end;

         if RequestInfo.ContentRangeStart<=FileStream.Size then
           FileStream.Position:=RequestInfo.ContentRangeStart
         else
         begin
           RequestInfo.ContentRangeStart:=0;
           RequestInfo.ContentRangeEnd:=0;
         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:=MimeTable.GetFileMIMEType(FileName);
         ResponseInfo.ContentLength:=RequestInfo.ContentLength;
         ResponseInfo.Date:=FileDate;
         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
         begin
           Stream:=TIdStreamVCL.Create(FileStream);
           try
             Context.Connection.IOHandler.Write(Stream,-1);
           finally
             Stream.Free;
           end;
         end;
       finally
         FileStream.Free;
       end;
     except
       on EFOpenError do Abort;
     end;
    end;

  • Slym © (13.01.11 08:40) [4]
    чуть по новее под 10Indy
    procedure TCore.ServeFile(const FileName: string; Context: TIdContext;
     RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
    var
     FileStream:TFileStream;
     FileTime: TFileTime;
     DosFileTime:integer;
     FileDate,ReqDate:TDateTime;
    begin
     try
       FileStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
       try
         //Used GMT date
         if not GetFileTime(FileStream.Handle,nil,nil,@FileTime) then RaiseLastOSError;
         if not FileTimeToDosDateTime(FileTime,LongRec(DosFileTime).Hi, LongRec(DosFileTime).Lo) then RaiseLastOSError;
         FileDate := FileDateToDateTime(DosFileTime);

         //Check not modified
         ReqDate := StrInternetToDateTime(RequestInfo.RawHeaders.Values['If-Modified-Since']);
         if (ReqDate <> 0) and (abs(ReqDate-FileDate)<2*(1/(24*60*60))) then
         begin
           ResponseInfo.ResponseNo := 304;
           ResponseInfo.WriteHeader;
           exit;
         end;

         if RequestInfo.ContentRangeStart<=FileStream.Size then
           FileStream.Position:=RequestInfo.ContentRangeStart
         else
         begin
           RequestInfo.ContentRangeStart:=0;
           RequestInfo.ContentRangeEnd:=0;
         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:=FServer.MIMETable.GetFileMIMEType(FileName);
         ResponseInfo.ContentLength:=RequestInfo.ContentLength;
         ResponseInfo.Date:=FileDate;
         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
           Context.Connection.IOHandler.Write(FileStream,ResponseInfo.ContentLength);
       finally
         FileStream.Free;
       end;
     except
       on EFOpenError do Abort;
     end;
    end;

 
Конференция "Сети" » IdHTTPServer indy 9 и файл больше 10 Мб? [D7, WinXP]
Есть новые Нет новых   [134436   +25][b:0][p:0.003]