|
Вопрос # 4 770/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты! Подскажите как можно проверить есть докачка у файла или нет.
|
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 28 ноября 2010, 17:38
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, eclipse!
Я знаю только один надежный способ узнать о том, есть ли докачка или нет. Это попытаться ее сделать. Например сразу. или стартовав основной поток на закачку, стартуем ещё один, ближе к концу. Если сервер возвращает в заголовках, что это не часть файла, а начинает качать с начала (это к примеру можно узнать по передаваемому размеру. Мы, задав диапазон, знаем, сколько байт должен вернуть сервер).
Но нужно помнить, что некоторые сервера не совсем честно "поддерживают" докачку. Например, в одно время, rapidshara давала возможность сделать докачку, но возвращала одни нули или мусор.
|
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 ноября 2010, 19:18
Оценка за ответ: 5
Комментарий к оценке: Ты прав! подругому никак! :)
|
Мини-форум вопроса
Всего сообщений: 20; последнее сообщение — 29 ноября 2010, 16:44; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 28 ноября 2010, 18:34 [#1]:
Если ссылка статическая, то да. Иначе - к админу сервера, на котором файл живёт.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 28 ноября 2010, 18:51 [#2]:
Ну это в принципе понятно, а вот как узнать это?
idhttp.head ?
в нём рыться?
|
|
Вадим К (статус: Академик), 28 ноября 2010, 19:15 [#3]:
Даже если ссылка статическая, это ещё ничего не значит. Сервер может не давать докачку. А почему - а просто админ/программист так решил. Или не смог ее сделать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 28 ноября 2010, 19:36 [#4]:
Хм... а какой код он должен вернуть? (Если сервер возвращает в заголовках...)
Я сперва качаю часть файла , к стати от сюда - http://exe.agent.mail.ru/magentsetup.exe, тупо первым попался..., потом прерываю допустим на 2 Mb. после чего продолжаю скачивать. дожидаюсь закачки и прогрессбар показывает что скачано около 130 %.
Так вот... о тока меня осенило пока Вам писал - может сравнивать, допустим размер который скачался с размером который нам даст AWorkCountMax, и если допустим на сервере общий размер = 10 метрам, а из них 2 на винте - тогда AWorkCountMax должен дать нам 8 метров... так?... следовательно докачка есть... но тут минус что об этом мы узнаем только в следствии докачки самой... Но если нам вернётся AWorkCountMax равное размеру значит фиг а не докачка...
Так?
|
|
Вадим К (статус: Академик), 28 ноября 2010, 22:49 [#5]:
у компонента IdHttp есть свойсто responds (вроде так). У него куча подсвойств - это распарсенный ответ. Как только сработало событие начала закачки, мы можем его анализировать. Там будет и размер, и много чего. Справитесь?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 10:36 [#6]:
Вы имели ввиду Response?
Ах да... чуть не забыл... DrWeb файл проекта увидел почему-то как вирус (троян) и удалил, экзешник.
|
|
Вадим К (статус: Академик), 29 ноября 2010, 10:55 [#7]:
да, Response
А доктор Веб такой, Ваша программа качает с интернета exe файлы? - качает. Спрашивает пользователя - нет. Значит троян
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 11:12 [#8]:
Блин уже сделал в два потока ... 1 - сперва выставляю в range кусок который хочу скачать (5 килобайт) потом идёт проверка через response ... это всё работает так как надо!
потом в основном потоке выставляю request.contentrangestart в нужную мне величину... а именно скока до этого скачал (естественно если есть докачка... это я узнаю с первого потока).
Опять же всё работает нормально.... качает с места назначения... в итоге файл с докачкой выкачивается весь (пробовал с докачкой), файл без докачки качается заново... это всё я сделал. НО! файл, в моём случае архив, выкачивается с ошибкой почему - то! хотя через download master он выкачивается нормально (пробовал по разному).
|
|
Вадим К (статус: Академик), 29 ноября 2010, 11:24 [#9]:
рекомендую выкачать файл менеджером закачки, а потом Вашим менеджерам. А после этого хекс редактором сравнить. Я думаю, наблюдается краевой эффект (то есть либо внахлест скачивается, либо один байт на границе не докачивается.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:06 [#10]:
Ха-ха... такая идея была у меня... пробовал докачивать и с позиция+1 , скачивается ровно на 1 меньше...
|
|
Вадим К (статус: Академик), 29 ноября 2010, 16:09 [#11]:
а позиция случайно не с нуля считается?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:12 [#12]:
нет... с того места с которого оборвалась скачка. это я проверял выводя в label размер скачанного файла (ну мысля ясна надеюсь).
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:22 [#13]:
В общем у меня агоритм таков :
это в кратце...
LoadedSz:= SizeOfFile(Form4.suiEdit2.Text);
Form4.idhtp1.Head(Form4.suiEdit1.Text);
Form4.idhtp1.Request.ContentRangeStart:= LoadedSz;
Form4.lbl2.Caption:= IntToStr(Form4.Idhtp1.Response.ContentLength); // вот тут вылазит 0, а то что нужно (установленная позиция) появляется только послеповторного запуска.
rcvrdata:=TFileStream.Create(Form4.suiEdit2.text, fmCreate);
rcvrdata.Seek(LoadedSz, soFromBeginning);
Form4.idHtp1.Get(Form4.suiEdit1.text, rcvrdata);
прикол весь в том, что если сделать так, то докачка прекрасно работает... так как надо, даже файл скачивается нормально! НО! (опять ...) 1 - нельзя узнать докачку как тока начали качать (если 1 раз запустилось, т.е. без закачки) и 2 - если сервер не даёт нам докачку естественно получается чушь!
но если делать в 2 потока - то, 1 - скачивать кусочек (н-р 5 кб) делая туже функцию... естественно использовать другой фал например temp.tmp, короче менять исходные приёмники, то всётаки мы узнаём что есть или нету докачки, зато файл дкачивается криво (используя второй поток , как приведено выше, ну там тока добавится if это так then докачивать или нет). В общем така проблемка!
|
|
min@y™ (статус: Доктор наук), 29 ноября 2010, 16:22 [#14]:
Убери +1 и всё пучком будет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:27 [#15]:
В общем я так понял позиция для докачки устанавливается в тот момент когда сперва сделать
Form4.idhtp1.Request.ContentRangeStart:= LoadedSz;
а потом
Form4.idHtp1.Get(Form4.suiEdit1.text, rcvrdata);
но делая так невозможно узнать установилась ли позиция для докачки в нужную позицию!
короче нужно как-то это узнать перед get запросом!
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:28 [#16]:
min@y™ так пробовал и так тоже!
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:29 [#17]:
min@y™ весь прикол в том что в первом потоке я узнаю про докачку, но узнавая её второй поток мне кажется криво скачивает.
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:31 [#18]:
А Вы сами писали такую программу?
|
|
min@y™ (статус: Доктор наук), 29 ноября 2010, 16:33 [#19]:
Цитата (eclipse):
А Вы сами писали такую программу?
с докачкой - нет.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
eclipse (статус: Посетитель), 29 ноября 2010, 16:44 [#20]:
Значит вместе мучать будем!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|