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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Докачка файл по http, после разрыва соеднинения 
:(
    Опции темы
chiffa
Дата 12.12.2014, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем доброе время суток. Есть код по скачиванию файла с сервера, поддержимающий паузу и придолжения закачки:


Код



procedure DownLoad;
var
sz,sz1,sz2,full:Int64;
s,url:string;
http:TIdHTTP;
f:TFileStream;
i, n:Integer;
dlsize,endsize:string;


toBat:String;
fi:TextFile;
 FileDir, GetPath:String;

label
a;
begin
begin

if IsConnected() = true then
//--------------
else
begin
//ShowMessage('No network connection!');
exit;
end;


end;
//Form1.Button1.Enabled:=false;
n:=0;
s:='Arhive.zip';

url:='http://10.10.10.9/dwn/Arhive.zip';

if FileExists(s) then
begin
f:=TFileStream.Create(s,fmOpenReadWrite or fmShareDenyNone);
sz:=f.Size;
//Form1.Label1.Caption:='Unfinished download found: '+s;
sz1:=sz-1;
goto a;
end
else
begin
sz1:=0;
end;
f:=TFileStream.Create(s,fmCreate or fmShareDenyNone);
a:
FreeAndNil(f);
http:=TIdHTTP.Create(nil);
http.Response.KeepAlive := true;
http.HandleRedirects:=true;
http.Head(url);
full:=http.Response.ContentLength;
endsize:=BytesToMbytes(full);
Form1.Label6.Caption:= endsize+' Mb';


begin
sz2:=http.Request.ContentRangeEnd;
begin
for i:= 0 to 1000000000 do
begin

     {
if IsConnected() = false then
begin

ShowMessage('No Internet!');
exit;
end;
   }

try



sz2:=sz1+200000;

dlsize:=BytesToMbytes(sz2-200000);

Form1.Label7.Caption:='Downloaded '+dlsize+' Mb of';
http.Request.ContentRangeStart:=sz1;
http.Request.ContentRangeEnd:=sz2;
f:=TFileStream.Create(s,fmOpenReadWrite or fmShareDenyNone);
f.Seek(0-1,soFromEnd);
Application.ProcessMessages;
http.Get(url,f);
full:=http.Response.ContentLength;
FreeAndNil(f);
sz1:=sz2;





except
begin

FreeAndNil(http);
FreeAndNil(f);

Form1.Label6.Caption:='';
Form1.Label7.Caption:='';





exit;
end;
if (sz2 <> full) then
begin
end
else
begin

FreeAndNil(http);
FreeAndNil(f);
Form1.Label6.Caption:='';
Form1.Label7.Caption:='';

exit;
end;
end;
end;
end;
end;



end;






Все это вынесено в отдельный поток:
Код

NewThread:=TNewThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpHigher;
NewThread.Resume;




При остановке потока и продолжении по кнопке либо же просто ожидании окончания скачивания файла - все норм. Если же идет обрыв соединения, после восстановления качать продолжает вроде как с тех байт на которых оборвало, но при этом после завершения закачки архив битый...

На стороне сервера отдача идет через Апачи, архив лежив в папке и к нему идет прямо обращение.


Возможно проблемана тороне сервера?... и файл нужно отдавать как то "по особенному". Пробовал через ПХП с заголовками тогда Делфи просто не качает....

Подскажите: как правильно реализовать скачивание файла с докачкой? Буду весьпризнателен за помощь! Заранее спасибо!

Это сообщение отредактировал(а) chiffa - 12.12.2014, 03:36
PM MAIL   Вверх
Illusion Dolphin
Дата 12.12.2014, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



1) Отформатируйте код, ничего не понятно (в новых делфи нажмите хотя бы Ctrl+D)
2)
Цитата

goto a;

Уберите готу и забудьте про него, вместо него есть функции, for, while
3) 
Цитата

Form1.Label6.Caption := endsize + ' Mb';

Нельзя из потока обращаться к визуальным компонентам без Synchronize
4) 
Цитата

for i := 0 to 1000000000 do

А почему не до 10000000000 ?
5) 
Цитата


          begin
            FreeAndNil(http);
            FreeAndNil(f);
            exit;
          end;
          if (sz2 <> full) then
          begin
          end
          else
          begin
            FreeAndNil(http);
            FreeAndNil(f);
            exit;
          end;

Заменяется на:
Цитата

            FreeAndNil(http);
            FreeAndNil(f);

6) 
Цитата

    f := TFileStream.Create(s, fmOpenReadWrite or fmShareDenyNone);
    sz := f.Size;
    sz1 := sz - 1;

А почему -1?
7) 
Цитата

f.Seek(0 - 1, soFromEnd);

А чем вам не угодил последний байт?

Всё, я устал - исправьте хотя бы это.

Это сообщение отредактировал(а) Illusion Dolphin - 12.12.2014, 09:15


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
chiffa
Дата 12.12.2014, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



гм... спасибо за ответ, а может есть пример более "адекватного решения" закачки файла с восстановлением?....

Это сообщение отредактировал(а) chiffa - 12.12.2014, 10:20
PM MAIL   Вверх
Illusion Dolphin
Дата 13.12.2014, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Я примера не знаю. В вашем случае более адекватно ещё проверять перед закачкой  поддерживает ли сервер докачку, ибо если нет - не будет работать так. И ещё надо вам подумать над условием завершения цикла когда файл "закончился".


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
rodnover
Дата 15.12.2014, 05:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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