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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> загрузка файла из интернет, ошибка в коде 
V
    Опции темы
ano360
Дата 8.2.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть нерабочий код загрузки файла по URL, точнее HTML файлы он загружает без проблем, а вот любые другие в частности картинки не грузятся
пожалуйста не надо отсылать в другие темы, я хочу понять почему именно мой код не работает.
Симптомы: jpg загружаются неправильно. даже размер неправильный. размер файла из функцией  HttpQueryInfo определяется правильно:
Код

  HINTERNET hInternet =
        ::InternetOpen(
            TEXT("WinInet Test"),
            INTERNET_OPEN_TYPE_PRECONFIG,
            NULL,NULL,
            0);

    if (hInternet != NULL) {
         HINTERNET hRequest=InternetOpenUrl(hInternet, _T("http://rjdgtn.narod.ru/123.JPG"),NULL,0,INTERNET_FLAG_NEED_FILE|INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE,0);        
        if (hRequest != NULL) {
                         DWORD dwSize, cb = sizeof(DWORD);                 
             HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH  //служить для отримання коду про довжину файла
                                | HTTP_QUERY_FLAG_NUMBER,       //вказує що повертатиметься цілочисельне значення, а не стрічка
                                &dwSize,                        //буфер який буде отримувати інформацію
                                &cb,                            //розмір буфера
                                0);
             CString str;        
             str.Format(_T("%d"),dwSize);
             AfxMessageBox(str.GetBuffer());
                    // создаём выходной файл
             std::ofstream fnews("news.html",std::ios::out|std::ios::binary);
                    if (fnews.is_open()) for (;;) {
                        // читаем данные
                        char  szData[1024];
                        DWORD dwBytesRead;
                        BOOL bRead = 
                            ::InternetReadFile(
                                hRequest,
                                szData,sizeof(szData)-1,
                                &dwBytesRead);

                        // выход из цикла при ошибке или завершении
                        if (bRead == FALSE  ||  dwBytesRead == 0)
                            break;

                        // сохраняем результат
                        szData[dwBytesRead] = 0;
                        fnews << szData;
                 
                    }
        }
                // закрываем запрос
        ::InternetCloseHandle(hRequest);
        }
        // закрываем WinInet
        ::InternetCloseHandle(hInternet);
    


частично код взят отсюда http://www.rsdn.ru/?article/inet/wininet.xml

Добавлено через 11 минут и 51 секунду
ВСем спасибо за внимание.

ошибка была в следующем:

функция
Код

fnews << szData;

некорректно записывала не все данные в поток. применение функции 
Код

fnews.write(szData,dwBytesRead);


решило проблемы

Это сообщение отредактировал(а) ano360 - 8.2.2009, 13:12


--------------------
Жизнь есть.
PM MAIL WWW ICQ   Вверх
jython
Дата 31.3.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include "wininet.h"
...
void __fastcall TUpdaterForm::Button1Click(TObject *Sender)
**
char szUrl[] = "http://www.ximik.nsk.ru/collection/D.I.Mendeleev.exe"; \\что качаем

HINTERNET hInternet = InternetOpen("MY AGENT",
INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
HINTERNET hRequest = InternetOpenUrl(hInternet, szUrl, NULL, 0, 0, 0);
DWORD SumSize;
InternetQueryDataAvailable(hRequest, &SumSize, 0, 0);

if(hRequest)
**
DWORD dwRead;
char szTemp[1024];
TFileStream* fs = new TFileStream(ExtractFilePath(Application->ExeName) + "\\D.I.Mendeleev.exe", fmCreate);
ProgressBar1->Max = SumSize;
ProgressBar1->Min = 0;
while (InternetReadFile(hRequest, (LPVOID)szTemp, 1024, &dwRead))
**
if (!dwRead) break;
fs->Write(szTemp, dwRead);
ProgressBar1->StepBy(1024) ;
}
delete fs;
}
InternetCloseHandle(hRequest);
InternetCloseHandle(hInternet);


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


 




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


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

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