Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 949

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Имеется программа, которая при нажатии на кнопку, должна вывести размер файла в интернете.
Например берем файл: http://files3.rarlab.com/rar/wrar371ru.exe
Его размер: 1286949 байт
Нажимаю кнопку... и получаю в ответ %JII
Что я делаю не так?

P.S. При первом нажатии на кнопку поле просто очищается, при втором и последующих выводит %JII

Прикладываю код и полный комплект (Delphi 2007)

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, Wininet;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. Edit1: TEdit;
  13. procedure Button1Click(Sender: TObject);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19.  
  20. var
  21. Form1: TForm1;
  22. hSession, hFile: HInternet;
  23. dwBuffer, dwBufferLen, dwIndex: DWORD;
  24.  
  25. implementation
  26.  
  27. {$R *.dfm}
  28.  
  29. procedure TForm1.Button1Click(Sender: TObject);
  30. begin
  31.  
  32. hSession := InternetOpen('NAME', LOCAL_INTERNET_ACCESS, nil, nil, 0);
  33. if assigned(hsession) then
  34. begin
  35.  
  36. hfile := InternetOpenURL
  37. (hSession,PChar('http://files3.rarlab.com/rar/wrar371ru.exe'),
  38. nil,
  39. 0,
  40. 0,
  41. 0);
  42.  
  43. HttpQueryInfo(hFile,
  44. HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
  45. @dwBuffer,
  46. dwBufferLen,
  47. dwIndex);
  48. if assigned(hfile) then
  49. InternetCloseHandle(hfile);
  50. InternetCloseHandle(hsession);
  51.  
  52. edit1.Text := Pchar (@dwBuffer);
  53. end;
  54. end;
  55.  
  56. end.


minc0rel Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: minc0rel (статус: Посетитель)
Вопрос отправлен: 1 октября 2007, 12:28
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Твой код не читал, голова болит :))
Зато выдрал из своего РАБОЧЕГО исходника процедуру закачки файла-картинки с сервера с узнаванием её размера в байтах и показом прогресса выполнения:

procedure TImageDownloader.Execute;
var
  Buffer: array of Char;
  Success: Boolean;
  Readed, ReadedTotal: Cardinal;
begin
  FStatus:= 'Клянчу картинку ' + FURL + '...';
  DoOnStatus(False);
  FhFile:= InternetOpenUrl(FhInet,
                           PChar(FURL),
                           nil,
                           0,
                           INTERNET_FLAG_NO_COOKIES or INTERNET_FLAG_NO_CACHE_WRITE,
                           0);
 
 
 
  if FhFile = nil
    then begin
           FErrorCode:= deInternetProblem;
           Exit;
         end;
 
  if (not InternetQueryDataAvailable(FhFile, FFileSize, 0, 0)) or (FFileSize = 0)
    then begin
           FErrorCode:= deFileNotFound;
           Exit;
         end;
 
  SetLength(Buffer, FBufferSize);
 
  FStatus:= 'Заливаю картинку ' + FURL + '...';
  DoOnStatus(False);
 
  ReadedTotal:= 0;
  FTimer.Enabled:= True;
 
  repeat
    Success:= InternetReadFile(FhFile, @Buffer[0], Length(Buffer), Readed);
    if Success
      then FStream.Write(Buffer[0], Readed);
 
    Inc(ReadedTotal, Readed);
    FStatus:= 'Заливаю картинку ' + FURL + ' - [' + FileSize2Str(ReadedTotal) + ']';
    FDeltaSize:= Readed;
    FProgress:= Round(100 * ReadedTotal / FFileSize);
    if FProgress > 100
      then FProgress:= 100;
 
    DoOnStatus(False);
    //Sleep(200);
  until (Readed = 0) or not Success or MainForm.FCancelled;
 
  FTimer.Enabled:= False;
 
  if not Success
    then FErrorCode:= deInternetProblem;
end;

Ненужное выкинешь, нужное - добавить по вкусу. :)
В прицепе - полный модуль класса.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 1 октября 2007, 15:24
Оценка за ответ: 4

Ответ #2. Отвечает эксперт: Feniks

Здравствуйте, minc0rel!
Попробуйте ниже приведенный код.

Приложение:
  1. uses wininet;
  2. ...
  3.  
  4. var
  5. hSession,hFile:hInternet;
  6. dwBuffer:array[1..20] of char;
  7. dwBufferLen,dwIndex:DWORD;
  8. begin
  9. Result:=0;
  10. hSession:=InternetOpen('GetUrlSize',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
  11. if Assigned(hSession) then begin
  12. hFile:=InternetOpenURL(hSession,PChar(URL),nil,0,INTERNET_FLAG_RELOAD,0);
  13. dwIndex:=0;
  14. dwBufferLen:=20;
  15. if HttpQueryInfo(hFile,HTTP_QUERY_CONTENT_LENGTH,@dwBuffer,dwBufferLen,dwIndex) then Result:=StrToInt(StrPas(@dwBuffer));
  16. if Assigned(hFile) then InternetCloseHandle(hFile);
  17. InternetCloseHandle(hsession);
  18. end;
  19. end;


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 1 октября 2007, 16:47
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 2 октября 2007, 02:01; участников в обсуждении: 1.
minc0rel

minc0rel (статус: Посетитель), 1 октября 2007, 14:08 [#1]:

хм...
первую часть вопроса решил сам:
вместо edit1.Text := Pchar (@dwBuffer);
пишем edit1.Text := inttostr(integer(dwBuffer));
и получаем заветные: 1286949 байт

Но осталась еще одна проблема...
При первом нажатии на кнопку получаем edit1.Text = 0
При втором и следующем edit1.Text = 1286949
В чем проблема?
minc0rel

minc0rel (статус: Посетитель), 2 октября 2007, 02:01 [#2]:

Всем спасибо!!! Вот что у меня получилось:
[code]unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Wininet;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetFileSize(url: string): string;
var
hSession, hFile: hInternet;
dwBuffer, dwBufferLen, dwIndex: DWORD;
begin
Result := '';
//открываем сессию
hSession := InternetOpen('Name', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if assigned(hsession) then
begin
//открываем URL нужного нам файла
hfile := InternetOpenURL
(hSession,PChar(URL),
nil,
0,
INTERNET_FLAG_RELOAD,
0);
//запрашиваем размер
dwindex:=0;
dwBufferLen:=4;
HttpQueryInfo(hFile,
HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
@dwBuffer,
dwBufferLen,
dwIndex);
result := FloatToStrF(integer(dwBuffer)/1024, ffNumber, 8, 2) + ' kb';
if assigned(hfile) then
InternetCloseHandle(hfile);
InternetCloseHandle(hsession);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
Begin
Edit1.Text:= GetFileSize(Edit1.Text);
End;

end.[/code]
Все работает так как надо!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.03 сек.