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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IdHTTP и проблема с антивирусом, Не получается скачать весь файл 
:(
    Опции темы
naparNIK
Дата 25.4.2012, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Проблема в том, что антивирус (Nod32) не даёт скачать несколько последних байт файла (это сильно сжатый 7z архив), как я понял он в этот момент начинает проверять архив на наличие вирусов и т.д.
Т.к. проверка сжатого 7z архива идет долго, IdHTTP через некоторое время просто выдаёт ошибку
Код

Connection reset by peer

не скачивая последние несколько байт файла.
Пробовал менять параметры ConnectTimeout и ReadTimeout, но ничего не изменилось.

Вот код (для примера, на самом деле скачивание идет в отдельном потоке c отловом ошибок, индикатором скорости и т.д.):
Код

var FS:TFileStream;
...
FS:=TFileStream.Create('123.7z', fmCreate);
IdHTTP.Get('сайт/123.7z', FS);
FS.Free

PM MAIL   Вверх
XperT
Дата 25.4.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Попробуй вместо TFileStream использовать TMemoryStream, а уже после скачивания сохраняй его в файл.
PM MAIL   Вверх
naparNIK
Дата 26.4.2012, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С TMemoryStream всё то же самое.
PM MAIL   Вверх
MetalFan
Дата 26.4.2012, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(naparNIK @  25.4.2012,  20:15 Найти цитируемый пост)
антивирус (Nod32) не даёт скачать несколько последних байт файла

Так проблема с антивирусом. При чем тут индейцы?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
XperT
Дата 26.4.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(naparNIK @ 26.4.2012,  07:45)
С TMemoryStream всё то же самое.

Код увидеть можно? Потому что я предлагал немного другую последовательность действий, чем в первом сообщении и уже всё то же самое не может быть.
PM MAIL   Вверх
naparNIK
Дата 26.4.2012, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как я понял, антивирус на время проверки закрывает доступ к файлу на сайте. Поэтому не получается скачать файл, хоть в FileStream, хоть в MemoryStream. 

Цитата

Код увидеть можно


Набросал тестовую программу с TMemoryStream, не качает. Приходится выключать антивирус.

Код

unit Unit1;

interface

uses
  Winapi.Windows, System.SysUtils, System.Variants,
  System.Classes, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, Vcl.ExtCtrls,
  Vcl.ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP;

type
  TMainForm = class(TForm)
    Download: TButton;
    FileEdit: TLabeledEdit;
    Memo: TMemo;
    ProgressBar: TProgressBar;
    SpeedText: TLabel;
    HTTP: TIdHTTP;
    ProgressTimer: TTimer;
    PercentText: TLabel;
    procedure DownloadClick(Sender: TObject);
    procedure HTTPStatus(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: string);
    procedure HTTPWork(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    procedure HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    procedure ProgressTimerTimer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure HTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  THTTPThread = class(TThread)
  private
    procedure Error;
  protected
    procedure Execute; override;
  end;

var
  MainForm: TMainForm;
  Stream: TMemoryStream;
  HTTPThread: THTTPThread;
  Max, Current, PreCurrent: Int64;
  FileAdress: string;

implementation

{$R *.dfm}

procedure TMainForm.DownloadClick(Sender: TObject);
begin
  FileAdress := FileEdit.Text;
  HTTPThread := THTTPThread.Create(true);
  HTTPThread.Priority := tpHigher;
  HTTPThread.FreeOnTerminate := true;
  HTTPThread.Start;
  ProgressBar.Position := 0;
  PreCurrent := 0;
  SpeedText.Caption := 'Скорость: 0 КБ/с';
  ProgressTimer.Enabled := true;
end;

{ THTTPThread }

procedure THTTPThread.Execute;
begin
  inherited;
  Stream := TMemoryStream.Create;
  try
    MainForm.HTTP.Get(FileAdress, Stream);
    Stream.SaveToFile('file.7z');
  except
    Synchronize(Error);
  end;
  Stream.Free;
end;

procedure THTTPThread.Error;
begin
  MainForm.Memo.Lines.Add('Ошибка!')
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Current := 0;
  Max := 1;
end;

procedure TMainForm.HTTPStatus(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
  Memo.Lines.Add(AStatusText)
end;

procedure TMainForm.HTTPWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
  Current := AWorkCount;
end;

procedure TMainForm.HTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  Max := AWorkCountMax;
  Memo.Lines.Add('Скачивание началось')
end;

procedure TMainForm.HTTPWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  Memo.Lines.Add('Скачивание завершено');
  ProgressTimer.Enabled := false;
  ProgressBar.Position := 0;
  PreCurrent := 0;
  PercentText.Caption := '0%';
  SpeedText.Caption := 'Скорость: 0 КБ/с';
end;

procedure TMainForm.ProgressTimerTimer(Sender: TObject);
var
  progress: extended;
  speed: integer;
begin
  progress := (Current / Max) * 100;
  ProgressBar.Position := Round(progress);
  speed := (Current - PreCurrent) div 1024;
  PercentText.Caption := IntToStr(Round(progress)) + '%';
  SpeedText.Caption := 'Скорость: ' + IntToStr(speed) + ' КБ/с';
  PreCurrent := Current;
end;

end.


PM MAIL   Вверх
XperT
Дата 26.4.2012, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

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

Странное поведение. 

У меня есть продукт которым пользуется довольно большое количество пользователей и я уверен, что среди них есть и поклонники НОДа, но еще никто не жаловался, что встроенный в программу апдейтер не может скачать обновление. К тому же, если ваше предположение верное, тогда этот файл нельзя скачать и через браузер, а такого поведения как я понимаю вы не наблюдаете.
PM MAIL   Вверх
naparNIK
Дата 27.4.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



При скачивании через браузер закачка тоже "зависает" на 99,9 процентах, но через некоторое время 0,01% все-таки скачивается. При выключенном антивирусе все нормально.
PM MAIL   Вверх
XperT
Дата 27.4.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как вариант, если сервер поддерживает докачку, можете попробовать качать 2 части файла: первая - 95% файла, вторая - остальные 5%. Не знаю, поможет ли это избавится от проверки НОДа, но есть шанс, что когда в потоке не будет поноценного файла, то и антивирус долго анализировать его не станет.
PM MAIL   Вверх
MetalFan
Дата 27.4.2012, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(naparNIK @  26.4.2012,  16:07 Найти цитируемый пост)
Набросал тестовую программу

Смесь бульдога с носорогом. Я бы не рекомендовал такое "многопоточное" программирование...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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