|
Вопрос # 949/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Имеется программа, которая при нажатии на кнопку, должна вывести размер файла в интернете.
Например берем файл: http://files3.rarlab.com/rar/wrar371ru.exe
Его размер: 1286949 байт
Нажимаю кнопку... и получаю в ответ %JII
Что я делаю не так?
P.S. При первом нажатии на кнопку поле просто очищается, при втором и последующих выводит %JII
Прикладываю код и полный комплект (Delphi 2007)
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- 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;
- hSession, hFile: HInternet;
- dwBuffer, dwBufferLen, dwIndex: DWORD;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
-
- hSession := InternetOpen('NAME', LOCAL_INTERNET_ACCESS, nil, nil, 0);
- if assigned(hsession) then
- begin
-
- hfile := InternetOpenURL
- (hSession,PChar('http://files3.rarlab.com/rar/wrar371ru.exe'),
- nil,
- 0,
- 0,
- 0);
-
- HttpQueryInfo(hFile,
- HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
- @dwBuffer,
- dwBufferLen,
- dwIndex);
- if assigned(hfile) then
- InternetCloseHandle(hfile);
- InternetCloseHandle(hsession);
-
- edit1.Text := Pchar (@dwBuffer);
- end;
- end;
-
- end.
 |
Вопрос задал: 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!
Попробуйте ниже приведенный код.
Приложение: Переключить в обычный режим- uses wininet;
- ...
-
- var
- hSession,hFile:hInternet;
- dwBuffer:array[1..20] of char;
- dwBufferLen,dwIndex:DWORD;
- begin
- Result:=0;
- hSession:=InternetOpen('GetUrlSize',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
- if Assigned(hSession) then begin
- hFile:=InternetOpenURL(hSession,PChar(URL),nil,0,INTERNET_FLAG_RELOAD,0);
- dwIndex:=0;
- dwBufferLen:=20;
- if HttpQueryInfo(hFile,HTTP_QUERY_CONTENT_LENGTH,@dwBuffer,dwBufferLen,dwIndex) then
Result:=StrToInt(StrPas(@dwBuffer));
- if Assigned(hFile) then InternetCloseHandle(hFile);
- InternetCloseHandle(hsession);
- end;
- end;
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 1 октября 2007, 16:47
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 2 октября 2007, 02:01; участников в обсуждении: 1.
|
minc0rel (статус: Посетитель), 1 октября 2007, 14:08 [#1]:
хм...
первую часть вопроса решил сам:
вместо edit1.Text := Pchar (@dwBuffer);
пишем edit1.Text := inttostr(integer(dwBuffer));
и получаем заветные: 1286949 байт
Но осталась еще одна проблема...
При первом нажатии на кнопку получаем edit1.Text = 0
При втором и следующем edit1.Text = 1286949
В чем проблема?
|
|
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]
Все работает так как надо!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|