Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение размера файла перед закачкой 
V
    Опции темы
ASGDeveloper
Дата 15.6.2006, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: нет
Всего: 1



Для сабжа использую такую конструкцию:
Код

function GetUrlInfo(URL: string): Real;
var
hSession, hURL: HInternet;
SumSize: DWORD;
begin
hSession := InternetOpen('Mozilla', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hURL := InternetOpenURL(hSession, PChar(URL),nil, 0, 0, 0);
if InternetQueryDataAvailable(hURL, SumSize, 0, 0) then
Result:=SumSize else Result:=0;
InternetCloseHandle(hURL);
InternetCloseHandle(hSession);
Result:=Result/1024;
end;

Но работает она неправильно. Не подскажете где я ошибся? 
PM MAIL   Вверх
oleg1973
Дата 16.6.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34





--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
ASGDeveloper
Дата 16.6.2006, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: нет
Всего: 1



Цитата(oleg1973 @  16.6.2006,  02:42 Найти цитируемый пост)
http://msdn.microsoft.com/workshop/network...nloadtofile.asp  

Знаю я про нее. Но мне нужно конкретно получить размер. Может я качать файл то даже не буду. 
PM MAIL   Вверх
Matematik
Дата 16.6.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



Работает функция правильно, но если размер файла неизвестен она выдает непонятно что. Я сам не знаю но в wininet должны быть функции для отправки HEAD запроса. Хотя это просто делается на winsock или еще проще в инди.  
PM MAIL WWW ICQ   Вверх
ASGDeveloper
Дата 16.6.2006, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: нет
Всего: 1



Цитата(Matematik @  16.6.2006,  09:16 Найти цитируемый пост)
Работает функция правильно, но если размер файла неизвестен она выдает непонятно что. Я сам не знаю но в wininet должны быть функции для отправки HEAD запроса. Хотя это просто делается на winsock или еще проще в инди.

Проблема решилась таким кодом:
Код

function GetUrlInfo(const dwInfoLevel: DWORD; const FileURL: string): Real;
var
  hSession, hFile: hInternet;
  dwBuffer: Pointer;
  dwBufferLen, dwIndex: DWORD;

function RoundEx(X: Real): Real;
var
 s: string;
begin
 s := FloatToStr(X);
 s := Copy(s, 1, 4);
 Result := StrToFloat(s);
end;

function UnRoundEx(X: Real): Real;
begin
 Result := x * 1024;
end;
  
begin
  Result := 0;
  hSession := InternetOpen('Mozilla',INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hSession) then begin
     hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0,
                                      INTERNET_FLAG_RELOAD, 0);
     dwIndex  := 0;
     dwBufferLen := 20;
     if HttpQueryInfo(hFile, dwInfoLevel, @dwBuffer, dwBufferLen, dwIndex)
        then Result := StrToInt(StrPas(@dwbuffer));
     if Assigned(hFile) then InternetCloseHandle(hFile);
     InternetCloseHandle(hsession);
  end;
  Result:=Result/1024;
  Result:=RoundEx(Result);
end;
 
PM MAIL   Вверх
Yanis
Дата 21.6.2006, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



ASGDeveloper
Что то ты намудрил тут... Я бы сделал так:
Код
function GetInetFileSize(const url: string): DWORD;
var
  hInet, hUrl: HInternet;
  nSize: DWORD;
  nBuffLen, nIndex: DWORD;
begin
  Result := 0;
  hInet := InternetOpen('Mozilla', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if hInet <> nil then
    begin
      ShowMessage(IntToStr(Integer(hInet)));
      hUrl := InternetOpenUrl(hInet, PChar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      ShowMessage(IntToStr(Integer(hUrl)));
      if hUrl <> nil then
        begin
          { получаем инфу }
          nIndex :=  0;
          nBuffLen := SizeOf(nSize);
          if HttpQueryInfo(hUrl, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER, @nSize, nBuffLen, nIndex) then
            ShowMessage('File size: '+IntToStr(nSize))
          else
            nSize := 0;

          InternetCloseHandle(hUrl);
        end;
      InternetCloseHandle(hInet);
    end;
end;
 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 22.6.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



А что, INDY категорично отрецаем?

Код
uses IdHTTP;

function GetInetFileSize(const FileUrl:string):integer;
var idHTTP: TidHTTP;
begin
  Result:=0;
  idHTTP:=TIdHTTP.Create(nil);
  idHTTP.Head(FileUrl);
  Result:=idHTTP.Response.ContentLength;
  IdHTTP.Free;
end; 
 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Yanis
Дата 22.6.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: нет
Всего: 111



Цитата(Poseidon @  22.6.2006,  01:28 Найти цитируемый пост)
А что, INDY категорично отрецаем?

Иногда использование дополнительного моудля неоправдано... 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.