Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Проблемы с UrlDownloadToFile


Автор: urisan 7.12.2005, 12:41
Приветствую!
Подскажите, пожалуйста, такой вопрос. В проге скачиваю несколько файлов (около 20 шт.), ссылка к каждому имеет вид http://www.moi_sait.ru/GetReportsServlet?file=moi_fail.xxx.
Использую функцию UrlDownloadToFile. Закачка происходит в цикле. Проблема в том, что от каждого файла сохраняется только около 25 килобайт, т.е. каждый файл сохраняется только частично!!! smile Никак не пойму в чем дело. Есть подозрение, что функция просто не успевает скачивать первый файл, а уже происходит вызов ее на скачку второго, она первый бросает и начинает качать второй, и так далее... поэтому ниче и не успевает. Помогите разобраться!
P.S. пробовал использовать функцию InternetReadFile, но постоянно выдается ошибка I/O Error 1784. В MSDN написано, что неверный буфер. Тоже не пойму в чем проблема. Код взял из этого форума, буфер определен так: Buffer: array[0..1024] of char; BytesRead: cardinal; Тоже не пойму, в чем беда!
В общем, буду очень благодарен за любые советы!
Спасибо!

Автор: Snowy 7.12.2005, 13:03
Может подойдет этот вариант:
http://forum.vingrad.ru/index.php?showtopic=48563

Автор: urisan 7.12.2005, 14:50
Snowy
та же ерунда! IdHTTP тоже качает первые 25 Кб, а потом вообще вываливается! smile
В WinInet с буфером разобрался. Теперь другая проблема: в коде
Код

  sAppName:=ExtractFileName(Application.ExeName);
   hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PROXY, nil, nil, 0);
   //И наш УРЛ
   hURL := InternetOpenURL(hSession,PChar(Url),nil, 0, 0, 0);


hUrl после функции InternetOpenURL равен nil, выдает ошибку, что не может подключиться....
Ниче не пойму smile

Автор: Snowy 7.12.2005, 15:19
Цитата(urisan @ 7.12.2005, 14:50)
та же ерунда! IdHTTP тоже качает первые 25 Кб, а потом вообще вываливается!

Значит что-то у тебя не так.
Этот код полностью рабочий и проверенный.

Автор: RA 7.12.2005, 20:42
Цитата(urisan @ 7.12.2005, 12:41)
сохраняется только около 25 килобайт


Наверно нужно адрес форматировать прежде чем скачивать по нему.

переименую скаченный тобой 25 килобайтовый фаил в xxx.html и запусти, если там html страница то это то очём я говорил.

Автор: urisan 8.12.2005, 08:26
RAdmin
попробовал - точно, файлы по 25 кб - это html страницы. На них написано, что файл, который мне нужен, недоступен....
Объясни, плиз, поподробнее, что значит форматировать адрес?
Спасибо!

Автор: RA 8.12.2005, 17:36
Сложно объяснить smile .

Дай мне ссылку на то что пытаешься скачать, попробую наглядным способом объяснить.

Автор: Guest 9.12.2005, 14:23
Почему ей не быть?
Цитата

hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PROXY, nil, nil, 0);

Ты пытаешься направить соединение через прокси, а адрес прокси не указываешь...

Автор: bartram 13.12.2005, 22:54
Вот рабочий код:
Код

program Downloader;

uses
  Windows, WinInet;

var
 hInternet: pointer;
 hFile: pointer;
 DataBuff: pointer;
 Size, Bytes: dword;
 hOut: dword;

begin
  hInternet := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  hFile := InternetOpenUrl(hInternet, 'http://www.microsoft.com/file.jpg', nil, 0, 
INTERNET_FLAG_EXISTING_CONNECT, 0);
  if hFile <> nil then
   begin
    InternetQueryDataAvailable(hFile, Size, 0, 0);
    GetMem(DataBuff, Size);
    InternetReadFile(hFile, DataBuff, Size, Bytes);
    hOut := CreateFile('c:\image.jpg', GENERIC_WRITE, 0, nil, CREATE_NEW, 0, 0);
    if hOut <> INVALID_HANDLE_VALUE then
     begin
      WriteFile(hOut, DataBuff^, Size, Bytes, nil);
      CloseHandle(hOut);
     end;
    FreeMem(DataBuff);
    InternetCloseHandle(hFile);
   end;
  InternetCloseHandle(hInternet);                       
end.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)