Не правильное определение размера файла при скачивании из Инета. Где собака порылась ?

vashkovich

Итак есть процедура для скачивания файла
<b>function</b> TForm1.GetInetFile(<b>const</b> fileURL, FileName: <b>string</b>): boolean;
<b>const</b>
 BufferSize = <b>1024</b>;
<b>var</b>
 hSession, hURL: HInternet;
 Buffer: <b>array</b>[<b>1</b>..BufferSize] <b>of</b> Byte;
 ResumePos, BufferLen, SumSize: DWORD;
 f: <b>file</b>;
 sAppName: <b>string</b>;
 err: boolean;
 Ifl , iifl: Int64;
 I : integer;
<b>begin</b>
 Result:=False;
 sAppName := ExtractFileName(Application.ExeName);
 hSession := InternetOpen(PChar(sAppName),
 INTERNET_OPEN_TYPE_PRECONFIG,
 <i>// INTERNET_OPEN_TYPE_PROXY ,</i>
 <b>nil</b>, <b>nil</b>, <b>0</b>);
 <b>try</b>
 hURL := InternetOpenURL(hSession,
 PChar(fileURL),
 <b>nil</b>,<b>0</b>,INTERNET_FLAG_RELOAD,<b>0</b>);
 <b>try</b>
 AssignFile(f, FileName);
 <b>IF</b> FileExists(FileName) <b>then</b> 
 <b>begin</b>
 Reset(f,<b>1</b>); 
 ResumePos := FileSize(F); 
 Seek(F, FileSize(F)); 
 <b>end</b> <b>else</b> ReWrite(f,<b>1</b>);
<i>// Rewrite(f,1);</i>
 <b>if</b> hURL<> <b>nil</b> <b>then</b>
 <b>begin</b>
 InternetQueryDataAvailable(hURL, SumSize, <b>0</b>, <b>0</b>);
 ProgressBarUpDate.Min :=<b>0</b>;
 ProgressBarUpDate.Max :=<b>100</b>;
 LabelUpdate.Caption :='Размер файла : ' + FloatToStr(SumSize) + ' байт';
<i>// Почему ???</i>
<i>// Вот здесь всесто 1291000 получаю 829 </i>
<i>//</i>
 <b>if</b> ResumePos><b>0</b> <b>then</b> 
 <b>begin</b>
 InternetSetFilePointer(hURL,ResumePos,<b>nil</b>,<b>0</b>,<b>0</b>); <i>//Òî ñìåñòèìñÿ</i>
 <b>end</b>;
 <b>repeat</b>
 err:= InternetReadFile(hURL, @Buffer,
 SizeOf(Buffer), BufferLen);
 <b>IF</b> err= false <b>then</b> <i>//Îøèáêà ÷òåíèÿ</i>
 <b>begin</b>
 ShowMessage('Îøèáêà ÷òåíèÿ ôàéëà : ' + <b>String</b>(FileName));
 exit;
 <b>end</b>;

 BlockWrite(f, Buffer, BufferLen);
 ResumePos :=ResumePos + BufferLen;
 <b>until</b>
 BufferLen = <b>0</b>;
 <b>end</b>;
 CloseFile(f);
 Result:=True;
 <b>finally</b>
 InternetCloseHandle(hURL)
 <b>end</b>;
 <b>finally</b>
 InternetCloseHandle(hSession)
 <b>end</b>;
<b>end</b>;
Как обойти проблему ?
5 ответов

vashkovich

vashkovich wrote:> InternetQueryDataAvailable(hURL, SumSize, *0*, *0*);> ProgressBarUpDate.Min :=*0*;> ProgressBarUpDate.Max :=*100*;> LabelUpdate.Caption :='Размер файла : ' + FloatToStr(SumSize) + ' байт';> /// Почему ???/> /// Вот здесь всесто 1291000 получаю 829 /Потому что SumSize в этом случае - не длина файла, а длина пришедшего в данный момент куска. Открой для себя Google ;).


vashkovich

vashkovich wrote:> InternetQueryDataAvailable(hURL, SumSize, *0*, *0*);> ProgressBarUpDate.Min :=*0*;> ProgressBarUpDate.Max :=*100*;> LabelUpdate.Caption :='Размер файла : ' + FloatToStr(SumSize) + ' байт';> /// Почему ???/> /// Вот здесь всесто 1291000 получаю 829 /Потому что SumSize в этом случае - не длина файла, а длина пришедшего в данный момент куска. Открой для себя Google ;).Posted via ActualForum NNTP Server 1.3
Боюсь Вас огорчить но это не так.Ошибка возникает при попытке скачать файл в формате DBF, при скачивании EXE все работает корректно.У меня возникло чувство что нужно как-то подправить настройки Веб сервиса, но никак не могу понять где.


vashkovich

vashkovich wrote:> Боюсь Вас огорчить но это не так.http://groups.google.com/group/microsoft.public.inetsdk.programming.wininet/browse_frm/thread/ef8b06e5bdc77bfd/72a87fffb42ee9a2?lnk=st&q=&rnum=2&hl=en#72a87fffb42ee9a2---------------------------------------------------------------------InternetQueryDataAvailable does not report the amount of data in the file you are down loading. It only reports how much data in the buffer and available to be read at this time. So you should not useInternetQueryDataAvailable to try and find the size of a file. If you want to know the file size you should read the Content-Length header. If the file is send chunked then there may not be a way to find out the full file size. However you can always try sending a HEAD request before you do the GET request. In most cases this will give you a content-length header so you will know how much data the request will return for a GET.ThanksBrian [MS]Microsoft Developer Support---------------------------------------------------------------------


vashkovich

vashkovich wrote:> Боюсь Вас огорчить но это не так.http://groups.google.com/group/microsoft.public.inetsdk.programming.wininet/browse_frm/thread/ef8b06e5bdc77bfd/72a87fffb42ee9a2?lnk=st&q=&rnum=2&hl=en#72a87fffb42ee9a2---------------------------------------------------------------------InternetQueryDataAvailable does not report the amount of data in the file you are down loading. It only reports how much data in the buffer and available to be read at this time. So you should not useInternetQueryDataAvailable to try and find the size of a file. If you want to know the file size you should read the Content-Length header. If the file is send chunked then there may not be a way to find out the full file size. However you can always try sending a HEAD request before you do the GET request. In most cases this will give you a content-length header so you will know how much data the request will return for a GET.ThanksBrian [MS]Microsoft Developer Support---------------------------------------------------------------------Posted via ActualForum NNTP Server 1.3
Беру свои слова обратно !Но проблема осталась. DBF-ки все равно не скачиваются


vashkovich

ну а я тоже огорчу васне все сервера сообщают размер файла