Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно реализовать многосекционную закачку файла по http?


Страницы:   1 2 3

Usov ©   (2009-01-27 17:24:00) 

Как можно реализовать многосекционную закачку файла по http протоколу?


Usov   (2009-01-29 17:16:00) [21]


> кому неизвестно?

конечно же мне:)


Медвежонок Пятачок   (2009-01-29 17:08:00) [22]

так как неизвестно как поведет себя запись при одновременном обращении двух потоков к одному файлу

кому неизвестно?


Usov   (2009-01-29 17:00:00) [23]

Попытаюсь обобщить услышанное:
Задача закачать файл 100 байт в две секции в один файл (не создаем несколько временных).
1) получаем заголовок запроса для определения размера файла
2) создаем файловый поток для файла
3) создаем первый поток для idhttp где устнавливаем рендж с 0 по 50
4) устанавливаем позицию записи в файл в начало (необязательно)
5) делаем гет запрос
6) создаем второй поток для idhttp где устнавливаем рендж с 51 до 100
7) устанавливаем позицию записи с 51 байта
8) делаем гет запрос

пункты 4 и 7 под сомнением так как неизвестно как поведет себя запись при одновременном обращении двух потоков к одному файлу.

жду комментов и предложений


Медвежонок Пятачок   (2009-01-29 16:58:00) [24]

Он пишет в стрим, а не в файл.


Usov   (2009-01-29 16:56:00) [25]


> Разве он пишет в файл?

А куда если не в файл? можно конечно в TMemoryStream но ну его нафиг держать в памяти 4 гиговый файл.


Anatoly Podgoretsky   (2009-01-29 16:11:00) [26]


> Насколько я понял, то если указать рейндж например 100-500,
>  то компонет idHTTP запишет соответствено скачаное в файл
> с позиции 100 и по 500?

Разве он пишет в файл?


Медвежонок Пятачок   (2009-01-29 14:42:00) [27]

пример чего?
трех арифметических операций сложения вычитания и деления?


Usov   (2009-01-29 14:38:00) [28]

может у кого есть пример?


Медвежонок Пятачок   (2009-01-29 14:24:00) [29]

idHTTP запишет соответствено скачаное в файл с позиции 100 и по 500?

с какого перепугу?
он запишет скачиваемое либо по указанному адресу буфера, начиная с его начала, либо в текущую позицию потока, если в метод был передан поток.

но никак не с позиции 100, даже если это значение было в заголовке запроса.


Медвежонок Пятачок   (2009-01-29 14:14:00) [30]

то компонет idHTTP запишет соответствено скачаное в файл с позиции 100 и по 500?

Он ничего не знает ни про какие такие "позиции"


Usov   (2009-01-29 14:10:00) [31]

Насколько я понял, то если указать рейндж например 100-500, то компонет idHTTP запишет соответствено скачаное в файл с позиции 100 и по 500?
Получается для того чтоб дозакачать прерванную закачку надо:
или где то хранить информацию о количестве сегментов и начало и конец каждого сегмента для каждой закачки
или просматривать каким то образом файл для определения количества скачанных кусков.


Anatoly Podgoretsky   (2009-01-29 13:51:00) [32]

> Usov  (29.01.2009 13:02:11)  [11]

Дозакачку должен обеспечивать сервер, ему только надо сообщить какой диапазон существует.


Медвежонок Пятачок   (2009-01-29 13:40:00) [33]

то все потоки должны работать с единым указателем на файл?

зависит от личных политических взглядов.
могут и с одним, а могут и с отдельными темповыми файлами.


Usov   (2009-01-29 13:36:00) [34]


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

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


Usov   (2009-01-29 13:33:00) [35]


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

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

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


Медвежонок Пятачок   (2009-01-29 13:32:00) [36]

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


Медвежонок Пятачок   (2009-01-29 13:27:00) [37]

Как это файла нет, будем качать в память?

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


Usov   (2009-01-29 13:21:00) [38]


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

Как это файла нет, будем качать в память?
Рейндж я согласен указывать обязательно до GET запрса надо, но в параметрах GET я указываю куда idhttp будет складывать полученные данные, то есть TFileStrim.


Медвежонок Пятачок   (2009-01-29 13:08:00) [39]

так как там это уже все есть компонент TMultipartHttpDownloader но .

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

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

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


Usov   (2009-01-29 13:02:00) [40]

Реализация на ICS не интересует так как там это уже все есть компонент TMultipartHttpDownloader но .
Интересна реализация на TidHTTP. Я помоему врубился в технологию но не могу сообразить как реализовать дозакачку при использовании нескольких секций. Может как то пробежаться по файлу и определить где в файле есть данные а где нет, ведь писать то каждую секцию буду в определенное место?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо