Конференция "Сети" » Как можно реализовать многосекционную закачку файла по http?
 
  • Usov © (27.01.09 17:24) [0]
    Как можно реализовать многосекционную закачку файла по http протоколу?
  • Palladin © (27.01.09 18:47) [1]
    Его изучив. В лице поля заголовка Range.
  • Usov © (27.01.09 22:33) [2]
    А если по простому, можно ли это сделать с помощью TidHTTP (Indy) или THTTPCli (ICS)?
  • Palladin © (28.01.09 13:39) [3]
    У TIdHTTP есть соотвествующие свойства.
  • Usov © (28.01.09 19:54) [4]

    > У TIdHTTP есть соотвествующие свойства.

    Это все понятно, но как организовать несколько одновременных скачек и чтоб это все писать в один файл?
  • Медвежонок Пятачок © (28.01.09 21:25) [5]
    несколько idhttp
  • Usov © (29.01.09 10:25) [6]
    Насколько я понял многие знают ответ но неохотно делятся им:)
    Полазил немного по инету, поковырял библиотеку ICS, и пришел к выводу:
    для мультисекционной закачки необходимо:
    1) открыть файл на диске (TFileStream)
    2) создать массив с TidHTTP (количество их равно количеству секций)
    3) каждому элементу TidHTTP в свойстве .Reques.Range или .Reques.ContentRangeStart и .Reques.ContentRangeEnd (еще не разобрался) присваиваем этим свойствам соответствующие сегменты файла
    4) каждый элемент TidHTTP придется запускать в отдельном потоке
    тут напрашивается вопрос при срыве закачки как определить какой сегмент насколько закачан, при одной секции все понятно, а как быть если секций 5?
  • Медвежонок Пятачок © (29.01.09 10:52) [7]
    тут напрашивается вопрос при срыве закачки как определить какой сегмент насколько закачан, при одной секции все понятно, а как быть если секций 5?

    запоздалый вопрос.
    при срыве закачки уже поздняк метаться.
    еще при старте потоков, каждый должен знать откуда и докуда ему следует запрашивать рейндж.
  • Anatoly Podgoretsky © (29.01.09 11:36) [8]
    > Usov  (29.01.2009 10:25:06)  [6]

    Все, кроме пункта 4, для ICS потоки не нужны, так как он поддерживает событийную модель.
  • tesseract © (29.01.09 11:53) [9]

    > при одной секции все понятно, а как быть если секций 5?


    Читать из файла в которой закачиваешь.


    > Все, кроме пункта 4, для ICS потоки не нужны,


    Да они и ведут себя в потоке не всегда предсказуемо.
  • Anatoly Podgoretsky © (29.01.09 12:02) [10]
    > tesseract  (29.01.2009 11:53:09)  [9]

    > Да они и ведут себя в потоке не всегда предсказуемо.

    У многих такое c потоками даже без использования ICS
  • Usov © (29.01.09 13:02) [11]
    Реализация на ICS не интересует так как там это уже все есть компонент TMultipartHttpDownloader но .
    Интересна реализация на TidHTTP. Я помоему врубился в технологию но не могу сообразить как реализовать дозакачку при использовании нескольких секций. Может как то пробежаться по файлу и определить где в файле есть данные а где нет, ведь писать то каждую секцию буду в определенное место?
  • Медвежонок Пятачок © (29.01.09 13:08) [12]
    так как там это уже все есть компонент TMultipartHttpDownloader но .

    А какое он имеет отношение с сабжу?

    Может как то пробежаться по файлу и определить где в файле есть данные а где нет, ведь писать то каждую секцию буду в определенное место?

    Когда стартует первая закачка, то никакого файла еще нет.
    А рэйндж уже пора указывать.
    А указав рейндж для потока, надо его запомнить, чтобы потом не ворзникало мыслей "по файлу бегать"
  • Usov © (29.01.09 13:21) [13]

    > Когда стартует первая закачка, то никакого файла еще нет.
    > А рэйндж уже пора указывать.
    > А указав рейндж для потока, надо его запомнить, чтобы потом не ворзникало мыслей "по файлу бегать"

    Как это файла нет, будем качать в память?
    Рейндж я согласен указывать обязательно до GET запрса надо, но в параметрах GET я указываю куда idhttp будет складывать полученные данные, то есть TFileStrim.
  • Медвежонок Пятачок © (29.01.09 13:27) [14]
    Как это файла нет, будем качать в память?

    Он у тебя появлется еще до того, как запрос на файл на сервер уйдет?
  • Медвежонок Пятачок © (29.01.09 13:32) [15]
    выполнил первый запрос "head", получил размер ресурса.
    создал локальный файл указанного размера.
    поделил рамер на количество секций, определил границы секций.
    создал потоки, сказал им откуда качать, сколько качать, и начиная откуда качать.
    все!
    поток знает откуда брать данные и куда их складывать.
  • Usov © (29.01.09 13:33) [16]

    > Он у тебя появлется еще до того, как запрос на файл на сервер
    > уйдет?

    Фактически да

    var
     fs: TFileStream;
    begin
     fs := TFileStream.Create('c:\test.avi', fmCreate);
     ...
     колдуем с ранджем
     ...
     idHTTP.Get('http://anysite.com/test.avi', fs);
    end
  • Usov © (29.01.09 13:36) [17]

    > выполнил первый запрос "head", получил размер ресурса.
    > создал локальный файл указанного размера.
    > поделил рамер на количество секций, определил границы секций.
    >
    > создал потоки, сказал им откуда качать, сколько качать,
    > и начиная откуда качать.
    > все!
    > поток знает откуда брать данные и куда их складывать.

    Насколько я понимаю то все потоки должны работать с единым указателем на файл?
  • Медвежонок Пятачок © (29.01.09 13:40) [18]
    то все потоки должны работать с единым указателем на файл?

    зависит от личных политических взглядов.
    могут и с одним, а могут и с отдельными темповыми файлами.
  • Anatoly Podgoretsky © (29.01.09 13:51) [19]
    > Usov  (29.01.2009 13:02:11)  [11]

    Дозакачку должен обеспечивать сервер, ему только надо сообщить какой диапазон существует.
 
Конференция "Сети" » Как можно реализовать многосекционную закачку файла по http?
Есть новые Нет новых   [134438   +31][b:0][p:0.001]