Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 756

/ вопрос открыт /

Здравствуйте, эксперты! Пытаюсь сделать докачку в IDHTTP . но почемуто файл начинает качаться сначала... подскажите в чём проблема.

Приложение:
  1.  
  2. function FileSizes(fileName : wideString) : Int64;
  3. var
  4. sr : TSearchRec;
  5. begin
  6. if FindFirst(fileName, faAnyFile, sr ) = 0 then
  7. result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow)
  8. else
  9. result := -1;
  10.  
  11. FindClose(sr) ;
  12. end;
  13.  
  14. procedure TDownLoader.Execute;
  15. var
  16. RestartPos: DWORD;
  17. rcvrdata, temp1: TFileStream;
  18. begin
  19. try
  20. try
  21. if FileExists(Form1.edt2.text) then
  22. begin
  23. LoadedSz:= FileSizes(Form1.edt2.text);
  24. rcvrdata:=TFileStream.Create(Form1.edt2.text,fmOpenReadWrite);
  25. rcvrdata.Seek(LoadedSz, soBeginning);
  26. Form1.idHttp1.Response.ContentRangeStart:= LoadedSz;
  27. end
  28. else
  29. begin
  30. rcvrdata:=TFileStream.Create(Form1.edt2.text,fmCreate);
  31. end;
  32. Form1.idHttp1.Get(Form1.edt1.text, rcvrdata);
  33. except
  34. end;
  35.  
  36. finally
  37. rcvrdata.Free;
  38. end;
  39. end;
  40.  
  41.  


eclipse Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 22 ноября 2010, 20:00
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, eclipse!
Все реально. Нужно просто правильно заполнить запрос. У idhttp есть свойство request, которое хранит различные параметры запроса. У него есть подсвойство range. Это поле строковое и в нем нужно указать, что скачать. Формат такой "начальный_байт-конечный_байт". Например
IdHttp1.Request.range := '1-100'; // с первого по 100 байт
IdHttp1.Request.range := '1000-'; // с 1000 байта и до конца
Так как файл на диске уже есть, то посчитать, откудова качать, не сложно.
вот тут http://pda.delphimaster.net/?id=1274640351&n=18&p=1 даже примерчик есть:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 22 ноября 2010, 20:47
Оценка за ответ: 5

Комментарий к оценке: В ответе все верно.

Мини-форум вопроса

Всего сообщений: 24; последнее сообщение — 25 ноября 2010, 18:11; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

Amidamaru

Amidamaru (статус: 4-ый класс), 22 ноября 2010, 20:09 [#1]:

Может сервер не поддерживает докачку?
PS с инди тебе врятли ктонибудь будет помогать, они не очень популярны изза их глючности.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.
eclipse

eclipse (статус: Посетитель), 22 ноября 2010, 20:15 [#2]:

Докачка есть. К стати у Wininet такая же ситуация с internetSetFilePointer
eclipse

eclipse (статус: Посетитель), 23 ноября 2010, 10:50 [#3]:

А! Вадим, то есть нужно делать idHttp1.Response.ContentRangeStart:= допустим не 1000, а "1000-", чтобы докачивалось откуда нужно?
Вадим К

Вадим К (статус: Академик), 23 ноября 2010, 11:03 [#4]:

не получиться. idHttp1.Response.ContentRangeStart - это число, а не строка.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 23 ноября 2010, 11:08 [#5]:

А тоесть именно IdHttp1.Request.range

щас просто нет возможности пробовать... только вечером
Вадим К

Вадим К (статус: Академик), 23 ноября 2010, 11:30 [#6]:

Пример смотрели?
Можно по разному задать.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 23 ноября 2010, 18:12 [#7]:

Приер смотрел, но при компиляции программы delphi ругается на IdHttp1.Request.range ... в моём случае возможно только idHttp1.Response.ContentRangeStart
eclipse

eclipse (статус: Посетитель), 23 ноября 2010, 18:15 [#8]:

К стати может подскажете какую версию delphi использовать?
Вадим К

Вадим К (статус: Академик), 24 ноября 2010, 10:14 [#9]:

А это почти не имеет значения. От 7 и выше. 6 можно тоже использовать, но она просто использует старую версию инди и там может быть все немного по другому.

Если есть idHttp1.Response.ContentRangeStart - используйте его. Странно, сколько пишете, пишете, все не нравиться, а код хоть раз запустить пробовали?
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 24 ноября 2010, 10:46 [#10]:

Пробовал! нифига не выходит... файл качается заново.
Вадим К

Вадим К (статус: Академик), 24 ноября 2010, 10:55 [#11]:

А вот ругаться не стоит.

Раз не получается скачать - два варианта, либо сервер не поддерживает докачку (даже если другие качалки тянут, не факт, сервер по useragent может различать), Либо что то все таки не так задано.
И наверное нужно брать сниффер и смотреть, что там передается.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 24 ноября 2010, 11:04 [#12]:

Возможно и на useragent... может и не так что -то в коде... хотя выложил выше что и как... позже буду пробовать "колдовать"... потом отпишусь.
eclipse

eclipse (статус: Посетитель), 24 ноября 2010, 20:25 [#13]:

В ходе мучений выяснилось - что я оказывается пытаюсь установить contentRangeStart до того как я подключаюсь к файлу, то есть тупо "играю в игру с выключенным компом"ю
eclipse

eclipse (статус: Посетитель), 24 ноября 2010, 20:29 [#14]:

Как это можно сделать?
Вадим К

Вадим К (статус: Академик), 25 ноября 2010, 10:31 [#15]:

То есть??? Что сделать?
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 25 ноября 2010, 10:35 [#16]:

Всё спасибо за помощь.... я разобрался как сделать докачку.
Вадим К

Вадим К (статус: Академик), 25 ноября 2010, 10:41 [#17]:

Сильно отличается от приведенного примера? Он помог или нет? Можно и запостить сюда кусочки кода.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 25 ноября 2010, 11:09 [#18]:

Позже выложу готовый пример.
Вадим К

Вадим К (статус: Академик), 25 ноября 2010, 11:22 [#19]:

смотрел, смотрел на это
Form1.Idhtp1.Response.ContentRangeStart:= LoadedSz;
Form1.idhtp1.Request.ContentRangeStart:=Form1.Idhtp1.Response.ContentRangeStart ;
какой смысл выставлять параметры в Response ? это ответ от сервера.
Правильным наверно будет
Form1.idhtp1.Request.ContentRangeStart:=LoadedSz;
Но тогда чем это принципиально отличается от того, что я приводил в ответе?

А с прогрессом - правильнее делать так. при старте докачки прогресс выставлять не на ноль, а на скачанный размер. А то, что возвращает метод onWork - приплюсовывать.
Галочка "подтверждения прочтения" - вселенское зло.
eclipse

eclipse (статус: Посетитель), 25 ноября 2010, 16:06 [#20]:

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

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 16 ноября 2024, 20:39
Выполнено за 0.03 сек.