Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер загружающегося файла, HTTP 
:(
    Опции темы
W_A_S_J_A
Дата 8.4.2008, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В своем проекте я загружаю файл из интернета.
Я использую InternetOpen, InternetConnect, HttpOpenRequest, HttpSendRequest, InternetReadFile.
Подскажите что нужно написать чтобы узнать размер фала который я загружаю (чтобы потом использовать в построении прогресса).
И где нужно вписать?

Пышу на Bulder 6

Это сообщение отредактировал(а) W_A_S_J_A - 8.4.2008, 09:01
PM MAIL   Вверх
korian
Дата 8.4.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

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



для файлов, сервер обычно передает его размер в заголовке (Content-lenght кажись).
если не передает, тогда никак.
PM   Вверх
586
Дата 8.4.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код
DWORD dwSize, cb = sizeof(DWORD);
HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwSize, &cb, 0);

Функция вернёт FALSE, если размер неизвестен.
PM   Вверх
W_A_S_J_A
Дата 13.4.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Почему-то оно не правильно определяет размер файла. Я написал такой код:

Код

DWORD dwSize, cb = sizeof(DWORD);
                              
HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH  //служить для отримання коду про довжину файла
                                | HTTP_QUERY_FLAG_NUMBER,       //вказує що повертатиметься цілочисельне значення, а не стрічка
                                &dwSize,                        //буфер який буде отримувати інформацію
                                &cb,                            //розмір буфера
                                0);

Form1->Label12->Caption=dwSize;



hFile -повертает функция HttpOpenRequest
Премер:
                              hFile=HttpOpenRequest(hConnect, //Дескриптор сесії
                              "GET", uri,  NULL, NULL, &access, NULL,0);

При скатывании файла размером 18356 байт она говорит що файл размером: 2192443704.
В чем проблема?

Это сообщение отредактировал(а) W_A_S_J_A - 13.4.2008, 19:36
PM MAIL   Вверх
jonie
Дата 14.4.2008, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 5
Всего: 118



а где вы смотрите размер? уж не в dwSize конечно же?
Цитата

lpdwBufferLength 
[in, out] Pointer to a variable that contains, on entry, the size in bytes of the buffer pointed to by lpvBuffer
When the function returns successfully, this variable contains the number of bytes of information written to the buffer. In the case of a string, the byte count does not include the string's terminating null character.

When the function fails with an extended error code of ERROR_INSUFFICIENT_BUFFER, the variable pointed to by lpdwBufferLength contains on exit the size, in bytes, of a buffer large enough to receive the requested information. The calling application can then allocate a buffer of this size or larger, and call the function again.
т.е. не забудьте о тех 4-х байтах что вы считаете...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
W_A_S_J_A
Дата 14.4.2008, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я смотрю размер в dwSize
Код:    Form1->Label12->Caption=dwSize;


Цитата(jonie @  14.4.2008,  01:02 Найти цитируемый пост)
а где вы смотрите размер? уж не в dwSize конечно же?

Я не понял, а где я должен смортеть размер файла?
подскажыте пожалоста
PM MAIL   Вверх
Pulse69
Дата 14.4.2008, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



W_A_S_J_A, а HttpQueryInfo точно возвращает TRUE? А какой код возрвщает GetLastError?
Если получается FALSE то, может быть, для данного файла сервер не передаёт поле Conent-Length, а отправляет его по порциям, или после прекращения разрывает соединение. В этом случае, размер узнать никак не получится.

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
W_A_S_J_A
Дата 14.4.2008, 04:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я напысал :

                int hFilegf;
                hFilegf=HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH |HTTP_QUERY_FLAG_NUMBER,
                &dwSize, &cb,  0);

               if(hFilegf==NULL)
                        {
                        error = GetLastError();
                        Form1->Memo1->Lines->Append("TRUE");
                        Form1->Memo1->Lines->Append(FloatToStr(error));
                        Form1->Memo1->Lines->Append(FloatToStr(hFilegf));
                        }
               else
                        {
                        error = GetLastError();
                        Form1->Memo1->Lines->Append("FALSE");
                        Form1->Memo1->Lines->Append(FloatToStr(error));
                        Form1->Memo1->Lines->Append(FloatToStr(hFilegf));
                        }

повертает true, и значение: error =12150,       hFilegf=0.
Но OPERA первое чем загрузит его показывает какой его размер, то есть сервер говорит размер файла.
Я скачывал логотып цього форума, пробовал и из других сайтов загружать картинки, тот же результат
PM MAIL   Вверх
jonie
Дата 14.4.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 5
Всего: 118



Цитата

Я смотрю размер в dwSize
зря там смотрите.
если вы внимательно прочтете приведенный мною фрагмент MSDN, то увидите что смотреть надо не там..... а, в cb.
и вообще сверьтесь с MSDN....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Pulse69
Дата 14.4.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(jonie @  14.4.2008,  17:56 Найти цитируемый пост)
если вы внимательно прочтете приведенный мною фрагмент MSDN, то увидите что смотреть надо не там..... а, в cb.

Да почему в cb? У W_A_S_J_A, в принципе, всё правильно, кроме нескольких моментов:
1.    Почему вы полагаете, что если HttpQueryInfo вернула NULL, это свидетельствует об успешном завершении? В документации ясно сказано, что в случае успеха она возвращает TRUE.
2.    Почему в HttpQueryInfo в параметре lpdwIndex вы передаёте ноль? Там должен быть указатель на число типа DWORD, хранящее индекс поля.

В общем, вот небольшой кусок кода, который выводит (по крайней мере, у меня) правильное значение.
Код

    HINTERNET hsession = InternetOpen(L"My browser", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if(hsession)
    {
        HINTERNET hurl = InternetOpenUrl(hsession, L"http://forum.vingrad.ru/style_images/2/menu/menu_forum.gif", L"", 0, 0, 0);
        if(hurl)
        {
            DWORD  FileSize = 0;
            DWORD cb          = sizeof DWORD;
            DWORD index     = 0;

            if(HttpQueryInfo(hurl, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_CONTENT_LENGTH  ,&FileSize, &cb, &index))
            {
                std::cout << FileSize << std::endl;
            }

            InternetCloseHandle(hurl);
        }
        
        InternetCloseHandle(hsession);
    }    


FileSize после выполнения хранит число 18 356.

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
586
Дата 14.4.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(jonie @  14.4.2008,  10:56 Найти цитируемый пост)
зря там смотрите.

dwSize - размер файла.
cb - размер исходного и принятого буффера (т.е. &dwSize). Функция HttpQueryInfo универсальная, может возвращать и текст и число. Для текста актуален этот параметр. Для числа - незнаю, но я его указал, хотя в описании флага написано, что число 32 битное.
PM   Вверх
jonie
Дата 14.4.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 5
Всего: 118



бывает. ступил я... недочитал msdn)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
W_A_S_J_A
Дата 15.4.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pulse69 @  14.4.2008,  11:18 Найти цитируемый пост)
1.    Почему вы полагаете, что если HttpQueryInfo вернула NULL, это свидетельствует об успешном завершении? В документации ясно сказано, что в случае успеха она возвращает TRUE.


Приношу извинение, не внимательный, просто у меня там была другая лента (украинской), а я ленился ее переводить, вот и решил написать FALSE, та что-то был задумался и написал TRUE.
PM MAIL   Вверх
W_A_S_J_A
Дата 15.4.2008, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В чем проблема?
Оказывается что функция HttpQueryInfo возвращает "0" (пост Дата 14.4.2008, 04:24)

Когда пишу код:
Код

if(HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwSize, &cb, &index)==true)
                                {
                                 Form1->Label12->Caption=dwSize;
                                }


Оказывается что она возвращает FALSE (в Label12 ничего не записывается)
То есть сервер не говорит размер файла, но Pulse69 загружал тот же файл, и у него все работает хорошо, сервер возвращает размер файла

В чем всетаки проблема?
PM MAIL   Вверх
586
Дата 15.4.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(W_A_S_J_A @  15.4.2008,  18:15 Найти цитируемый пост)
if(HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwSize, &cb, &index)==true)

Нельзя так сравнивать. TRUE - это значение, отличимое от нуля.
Выложи весь код.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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