Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2011, 19:02   #1
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию EIdHTTPProtocolException при попытке скачать файл

Пытаюсь загрузить zip архив на компьютер с помощью idhttp. При этом, для скачивания требуется авторизация. При перехватывании снифером пакетов видно, что все пакеты приходят, но программа почему-то "не хочет" их сохранить, а выдает ошибку.
Код:
try
    try
      Response := TmemoryStream.Create;
      IdHTTP1.Request.BasicAuthentication := true;
      IdHTTP1.Request.Username := loginT3;
      IdHTTP1.Request.Password := passT3;
      IdHTTP1.get('http://io.mioo.ru/scanege/ikt/scan.zip', Response);
      Response.savetofile('scan.zip');
    except
      on E: Exception do
        ListBox1.Items.Append(datetimetostr(now) + ': ' + E.ClassName +
            ' ошибка с сообщением : ' + E.Message);
    end;
  finally
    Response.Free;
  end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 16.06.2011, 19:47   #2
Voody
Форумчанин
 
Регистрация: 22.06.2009
Сообщений: 310
По умолчанию

Попробуйте с TFileStream:

Код:
Response:=TFileStream.Create('scan.zip', FMCreate);
IdHTTP1.get('http://io.mioo.ru/scanege/ikt/scan.zip', Response);
Response.Free;
Voody вне форума Ответить с цитированием
Старый 16.06.2011, 20:02   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Попробовал - та же ошибка.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2011, 22:57   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Кому интересно, вот решение
Код:
procedure downloadfile(url, path, auth: string);
var
  hInternetSession: HINTERNET;
  hURL: HINTERNET;
  t: boolean;
  Buf: array [0 .. 1023] of byte;
  dwBytesRead: cardinal;
  f: tfilestream;
begin
  try
    hInternetSession := InternetOpen('Microsoft Internet Explorer',
      INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
    if assigned(hInternetSession) then
      try
        hURL := InternetOpenUrl(hInternetSession, pchar(url),
          pchar('Authorization: Basic ' + auth),
          length(pchar('Authorization: Basic ' + auth)),
          INTERNET_FLAG_RELOAD or
            INTERNET_FLAG_EXISTING_CONNECT, 0);
        if assigned(hURL) then
          try
            f := tfilestream.Create(path, fmCreate);
            repeat
              t := InternetReadFile(hURL, @Buf, 1024, dwBytesRead);
              f.Write(Buf, dwBytesRead);
            until t and (dwBytesRead = 0);
          finally
            f.free;
          end;
      finally
        InternetCloseHandle(hURL);
      end;
  finally
    InternetCloseHandle(hInternetSession);
  end;
end;
Параметр auth - base64 зашифрованная строка base64(loginassword)
Вот функция для зашифровки
Код:
function base64_encode(s: ansistring): ansistring;
const
  symb = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var
  l: ansistring;
  i: integer;
  k: byte;
begin
  l := '';
  i := 0;
  while i < length(s) do
  begin
    k := ord(s[1 + i]) shr 2;
    l := l + symb[k + 1];

    k := ord(s[1 + i]) shl 6;
    k := k shr 2 + ord(s[2 + i]) shr 4;
    l := l + symb[k + 1];

    k := ord(s[2 + i]) shl 4;
    k := k shr 2 + ord(s[3 + i]) shr 6;
    l := l + symb[k + 1];

    k := ord(s[3 + i]) shl 2;
    k := k shr 2;
    l := l + symb[k + 1];

    case length(s) - i of
      1:
        move(ansistring('=='), l[length(l) - 1], 2);
      2:
        move(ansistring('='), l[length(l)], 1);
    end;

    inc(i, 3);
  end;
  result := l;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка при попытке билда в masm'e nuevegramodelamor Помощь студентам 2 24.01.2011 19:45
AV при попытке вращения изображения Alex Cones Общие вопросы Delphi 11 12.10.2010 08:14
приложение подвисает, при попытке обновить шрифты AnTe Общие вопросы Delphi 2 07.12.2009 11:36
Ощибка при попытке заменить компонент ogg Помощь студентам 3 16.07.2009 18:57
ошибка при попытке запустить программу Fellot Общие вопросы Delphi 3 23.04.2009 21:23