-
Как можно реализовать многосекционную закачку файла по http протоколу?
-
Его изучив. В лице поля заголовка Range.
-
А если по простому, можно ли это сделать с помощью TidHTTP (Indy) или THTTPCli (ICS)?
-
У TIdHTTP есть соотвествующие свойства.
-
> У TIdHTTP есть соотвествующие свойства.
Это все понятно, но как организовать несколько одновременных скачек и чтоб это все писать в один файл?
-
несколько idhttp
-
Насколько я понял многие знают ответ но неохотно делятся им:)
Полазил немного по инету, поковырял библиотеку ICS, и пришел к выводу:
для мультисекционной закачки необходимо:
1) открыть файл на диске (TFileStream)
2) создать массив с TidHTTP (количество их равно количеству секций)
3) каждому элементу TidHTTP в свойстве .Reques.Range или .Reques.ContentRangeStart и .Reques.ContentRangeEnd (еще не разобрался) присваиваем этим свойствам соответствующие сегменты файла
4) каждый элемент TidHTTP придется запускать в отдельном потоке
тут напрашивается вопрос при срыве закачки как определить какой сегмент насколько закачан, при одной секции все понятно, а как быть если секций 5?
-
тут напрашивается вопрос при срыве закачки как определить какой сегмент насколько закачан, при одной секции все понятно, а как быть если секций 5?
запоздалый вопрос.
при срыве закачки уже поздняк метаться.
еще при старте потоков, каждый должен знать откуда и докуда ему следует запрашивать рейндж.
-
> Usov (29.01.2009 10:25:06) [6]
Все, кроме пункта 4, для ICS потоки не нужны, так как он поддерживает событийную модель.
-
> при одной секции все понятно, а как быть если секций 5?
Читать из файла в которой закачиваешь.
> Все, кроме пункта 4, для ICS потоки не нужны,
Да они и ведут себя в потоке не всегда предсказуемо.
-
> tesseract (29.01.2009 11:53:09) [9]
> Да они и ведут себя в потоке не всегда предсказуемо.
У многих такое c потоками даже без использования ICS
-
Реализация на ICS не интересует так как там это уже все есть компонент TMultipartHttpDownloader но .
Интересна реализация на TidHTTP. Я помоему врубился в технологию но не могу сообразить как реализовать дозакачку при использовании нескольких секций. Может как то пробежаться по файлу и определить где в файле есть данные а где нет, ведь писать то каждую секцию буду в определенное место?
-
так как там это уже все есть компонент TMultipartHttpDownloader но .
А какое он имеет отношение с сабжу?
Может как то пробежаться по файлу и определить где в файле есть данные а где нет, ведь писать то каждую секцию буду в определенное место?
Когда стартует первая закачка, то никакого файла еще нет.
А рэйндж уже пора указывать.
А указав рейндж для потока, надо его запомнить, чтобы потом не ворзникало мыслей "по файлу бегать"
-
> Когда стартует первая закачка, то никакого файла еще нет.
> А рэйндж уже пора указывать.
> А указав рейндж для потока, надо его запомнить, чтобы потом не ворзникало мыслей "по файлу бегать"
Как это файла нет, будем качать в память?
Рейндж я согласен указывать обязательно до GET запрса надо, но в параметрах GET я указываю куда idhttp будет складывать полученные данные, то есть TFileStrim.
-
Как это файла нет, будем качать в память?
Он у тебя появлется еще до того, как запрос на файл на сервер уйдет?
-
выполнил первый запрос "head", получил размер ресурса.
создал локальный файл указанного размера.
поделил рамер на количество секций, определил границы секций.
создал потоки, сказал им откуда качать, сколько качать, и начиная откуда качать.
все!
поток знает откуда брать данные и куда их складывать.
-
> Он у тебя появлется еще до того, как запрос на файл на сервер
> уйдет?
Фактически да
var
fs: TFileStream;
begin
fs := TFileStream.Create('c:\test.avi', fmCreate);
...
колдуем с ранджем
...
idHTTP.Get('
http://anysite.com/test.avi', fs);
end
-
> выполнил первый запрос "head", получил размер ресурса.
> создал локальный файл указанного размера.
> поделил рамер на количество секций, определил границы секций.
>
> создал потоки, сказал им откуда качать, сколько качать,
> и начиная откуда качать.
> все!
> поток знает откуда брать данные и куда их складывать.
Насколько я понимаю то все потоки должны работать с единым указателем на файл?
-
то все потоки должны работать с единым указателем на файл?
зависит от личных политических взглядов.
могут и с одним, а могут и с отдельными темповыми файлами.
-
> Usov (29.01.2009 13:02:11) [11]
Дозакачку должен обеспечивать сервер, ему только надо сообщить какой диапазон существует.