|
Вопрос # 4 756/ вопрос открыт / |
|
Здравствуйте, эксперты! Пытаюсь сделать докачку в IDHTTP . но почемуто файл начинает качаться сначала... подскажите в чём проблема.
Приложение: Переключить в обычный режим-
- function FileSizes(fileName : wideString) : Int64;
- var
- sr : TSearchRec;
- begin
- if FindFirst(fileName, faAnyFile, sr ) = 0 then
- result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow)
- else
- result := -1;
-
- FindClose(sr) ;
- end;
-
- procedure TDownLoader.Execute;
- var
- RestartPos: DWORD;
- rcvrdata, temp1: TFileStream;
- begin
- try
- try
- if FileExists(Form1.edt2.text) then
- begin
- LoadedSz:= FileSizes(Form1.edt2.text);
- rcvrdata:=TFileStream.Create(Form1.edt2.text,fmOpenReadWrite);
- rcvrdata.Seek(LoadedSz, soBeginning);
- Form1.idHttp1.Response.ContentRangeStart:= LoadedSz;
- end
- else
- begin
- rcvrdata:=TFileStream.Create(Form1.edt2.text,fmCreate);
- end;
- Form1.idHttp1.Get(Form1.edt1.text, rcvrdata);
- except
- end;
-
- finally
- rcvrdata.Free;
- end;
- end;
-
-
|
Вопрос задал: 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 (статус: 4-ый класс), 22 ноября 2010, 20:09 [#1]:
Может сервер не поддерживает докачку?
PS с инди тебе врятли ктонибудь будет помогать, они не очень популярны изза их глючности.
|
|
eclipse (статус: Посетитель), 22 ноября 2010, 20:15 [#2]:
Докачка есть. К стати у Wininet такая же ситуация с internetSetFilePointer
|
|
eclipse (статус: Посетитель), 23 ноября 2010, 10:50 [#3]:
А! Вадим, то есть нужно делать idHttp1.Response.ContentRangeStart:= допустим не 1000, а "1000-", чтобы докачивалось откуда нужно?
|
|
Вадим К (статус: Академик), 23 ноября 2010, 11:03 [#4]:
не получиться. idHttp1.Response.ContentRangeStart - это число, а не строка.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 23 ноября 2010, 11:08 [#5]:
А тоесть именно IdHttp1.Request.range
щас просто нет возможности пробовать... только вечером
|
|
Вадим К (статус: Академик), 23 ноября 2010, 11:30 [#6]:
Пример смотрели?
Можно по разному задать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 23 ноября 2010, 18:12 [#7]:
Приер смотрел, но при компиляции программы delphi ругается на IdHttp1.Request.range ... в моём случае возможно только idHttp1.Response.ContentRangeStart
|
|
eclipse (статус: Посетитель), 23 ноября 2010, 18:15 [#8]:
К стати может подскажете какую версию delphi использовать?
|
|
Вадим К (статус: Академик), 24 ноября 2010, 10:14 [#9]:
А это почти не имеет значения. От 7 и выше. 6 можно тоже использовать, но она просто использует старую версию инди и там может быть все немного по другому.
Если есть idHttp1.Response.ContentRangeStart - используйте его. Странно, сколько пишете, пишете, все не нравиться, а код хоть раз запустить пробовали?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 24 ноября 2010, 10:46 [#10]:
Пробовал! нифига не выходит... файл качается заново.
|
|
Вадим К (статус: Академик), 24 ноября 2010, 10:55 [#11]:
А вот ругаться не стоит.
Раз не получается скачать - два варианта, либо сервер не поддерживает докачку (даже если другие качалки тянут, не факт, сервер по useragent может различать), Либо что то все таки не так задано.
И наверное нужно брать сниффер и смотреть, что там передается.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 24 ноября 2010, 11:04 [#12]:
Возможно и на useragent... может и не так что -то в коде... хотя выложил выше что и как... позже буду пробовать "колдовать"... потом отпишусь.
|
|
eclipse (статус: Посетитель), 24 ноября 2010, 20:25 [#13]:
В ходе мучений выяснилось - что я оказывается пытаюсь установить contentRangeStart до того как я подключаюсь к файлу, то есть тупо "играю в игру с выключенным компом"ю
|
|
eclipse (статус: Посетитель), 24 ноября 2010, 20:29 [#14]:
Как это можно сделать?
|
|
Вадим К (статус: Академик), 25 ноября 2010, 10:31 [#15]:
То есть??? Что сделать?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 25 ноября 2010, 10:35 [#16]:
Всё спасибо за помощь.... я разобрался как сделать докачку.
|
|
Вадим К (статус: Академик), 25 ноября 2010, 10:41 [#17]:
Сильно отличается от приведенного примера? Он помог или нет? Можно и запостить сюда кусочки кода.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 25 ноября 2010, 16:06 [#20]:
Да бли времени не было до ума довести... уже всяку ерунду пробывал.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|