-
Пишу веб сервер на базе 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);
-
2 вопрос решон - обрыв происходил при запуске ПО под виртуальной машиной при запуске в нормальном режиме все ок.
как сделать возможность докачивать файлы?
-
> вопрос решон .. обрыв при запуске ..под виртуальной машиной
Даже если потеряное нашлось под столбом с фонарем, это не значит что именно под столбом оно было потеряно.
-
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
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);
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;
-
чуть по новее под 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
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);
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;
|