Как мога да внедря качване на файл с много секции чрез http
Как мога да реализирам качване на многосекционен файл чрез http протокол?
След като го проучих. Представено от полето за заглавка на диапазон.
И ако е просто, може ли да се направи с помощта на TidHTTP (Indy) или THTTPCli (ICS)?
TIdHTTP има съответните свойства.
> TIdHTTP има подходящите свойства.Всичко е ясно, но как мога да организирам няколко едновременни изтегляния и да запиша всичко това в един файл?
Доколкото разбирам, много хора знаят отговора, но не са склонни да го споделят :) Сърфирах малко в Интернет, порових се из ICS библиотеката и стигнах до извода: за изтегляне на няколко секции трябва: 1) да отворите файл на диск (TFileStream) 2) да създадете масив с TidHTTP (броят им е равен на броя на секциите) 3) за всеки TidHT TP елемент в свойството .Reques.Range или .Reques. ContentRangeStart и .Reques.ContentRangeEnd (все още не сме го разбрали) ние присвояваме съответните сегменти на файла 4) към тези свойства, всеки TidHTTP елемент ще трябва да се стартира в отделен поток тук възниква въпросът, когато изтеглянето е неуспешно, как да определим кой сегмент е колко е изтеглен, с една секция всичко е ясно, но какво, ако има 5 секции?
това повдига въпроса, когато изтеглянето е неуспешно, как да определите кой сегмент колко е изтеглен, с една секция всичко е ясно, но какво ще стане, ако има 5 секции?
закъснял въпрос. Вече е твърде късно да се бърза, когато изтеглянето се провали. Още в началото на стриймовете всеки трябва да знае къде и докъде трябва да поиска диапазона.
Всичко освен точка 4 не е необходимо за ICS, тъй като поддържа модела на събитията.
> с една секция всичко е ясно, но ако има 5 секции?
Прочетете от файла, в който качвате.
> Всички с изключение на точка 4, не са необходими потоци за ICS,
Да, правят госебе си в потока не винаги е предвидимо.
> Да, те се държат в поток не винаги е предвидимо.
Много имат това с потоци дори без да използват ICS
Внедряването на ICS не представлява интерес, тъй като вече има компонента TMultipartHttpDownloader там, но . Интересувам се от внедряването на TidHTTP. Според мен влязох в технологията, но не мога да разбера как да внедря допълнително изтегляне, когато използвам няколко секции. Мога ли по някакъв начин да прекарам файла и да определя къде във файла има данни и къде не, защото всеки раздел ще пиша на определено място?
тъй като всичко вече е там, има компонент TMultipartHttpDownloader, но .
И какво общо има с темата?
Мога ли по някакъв начин да прегледам файла и да определя къде във файла има данни и къде не, защото ще пиша всеки раздел на определено място?
Когато започне първото изтегляне, все още няма файл. И е време да посочите диапазона. И след като сте посочили диапазона за потока, трябва да го запомните, така че по-късно да нямате мисли "да минавате през файла"
> Когато започне първото изтегляне, все още няма файл. > И е време да посочите диапазона. > И след като посочите диапазона за потока, трябва да го запомните, така че по-късно да нямате мисли „да минавате през файла“Как няма файл, ще го изтеглим ли в паметта?
Как този файл не е достъпен, да го изтеглим ли в паметта?
Това при вас се появява дори преди заявката за файл на сървъра да напусне?
изпълни първата заявка "head", получи размера на ресурса. създаде локален файл с посочения размер. раздели размера на броя секции, определи границите на секциите. създадепотоци, каза им къде да изтеглят, колко да изтеглят и започвайки откъде да изтеглят. това е! потокът знае откъде да вземе данни и къде да ги постави.
> Ще го имате още преди заявката за файла към сървъра > напускам?Всъщност да
var fs: TFileStream; begin fs := TFileStream.Create("c:\test.avi", fmCreate); . предаване с диапазон . idHTTP.Get("http://anysite.com/test.avi", fs); край
> изпълни първата заявка "head", получи размера на ресурса. > създаде локален файл с посочения размер. > раздели размера на броя на секциите, определи границите на секциите. > > създаде потоци, каза им къде да изтеглят, колко да изтеглят, > и започвайки откъде да изтеглите. > всичко! > нишката знае откъде да вземе данни и къде да ги постави.Доколкото разбирам, всички нишки трябва да работят с един указател на файла?
тогава всички нишки трябва да работят с един файлов указател?
зависи от личните политически възгледи. може да бъде с един или с отделни темпови файлове.
Сървърът трябва да осигури допълнително изтегляне, трябва само да му се каже какъв диапазон съществува.
Доколкото разбирам, ако посочите диапазон, например 100-500, тогава idHTTP компонентът ще запише изтеглените данни във файла съответно от позиции 100 и 500? Оказва се, че за да изтеглите отново прекъснато изтегляне, трябва: или някъде да съхранявате информация за броя на сегментите и началото и края на всеки сегмент за всяко изтегляне или да видите файла по някакъв начин, за да определите броя изтеглени парчета.
тогава idHTTP компонентът ще запише изтеглените данни във файла съответно от позиции 100 и 500?
Той не знае нищо за подобни "позиции"
idHTTP ще запише съответно изтеглено във файлот позиция 100 до 500?
но не и от позиция 100, дори ако тази стойност е в заглавката на заявката.
може ли някой да има пример?
пример за какво? три аритметични операции събиране, изваждане и деление?
> Доколкото разбирам, ако посочите диапазон, например 100-500, > тогава компонентът idHTTP ще запише изтегленото съдържание във файла > от позиция 100 до 500?Записва ли във файл?
> Той пише ли във файл?Къде, ако не във файл? Можете, разбира се, в TMemoryStream, но добре, запазете го в паметта за 4 гигабайта файл.
Той пише в потока, а не във файла.
Ще се опитам да обобщя това, което чух: Задачата е да качите файл от 100 байта в две секции в един файл (ние не създаваме няколко временни). 1) вземете заглавката на заявката, за да определите размера на файла 2) създайте файлов поток за файла 3) създайте първия поток за idhttp, където задаваме диапазона от 0 до 50 4) задайте позицията за въвеждане на файла в началото (по избор) 5) направете заявка за получаване 6) създайте изяждаме втория поток за idhttp, където задаваме диапазона от 51 до 100 7) задайте позицията на запис от 51 байта 8) направете заявка за получаване
Точки 4 и 7 са под съмнение, тъй като не е известно как ще се държи записът, когато два потока имат достъп до един и същ файл едновременно.
тъй като не е известно как ще се държи писането, когато два потока имат достъп до един и същи файл едновременно
←→FireMan_Alexey ( 2009-02-03 14:32 ) [31]
Ако даден компонент пише в поток, имате размера на записания.Създайте 5 Mem потока и проверете за запълване, да кажем 128Kb всеки, и след запълването ги хвърлете на винта :)
←→FireMan_Alexey ( 2009-02-03 14:34 ) [32]
И когато изтеглянето прекъсне, има позиция в потокакъде да изтеглите след това се нарича TMemoryStream.SIZE :)
> И когато изтеглянето прекъсне, има позиция в потока, откъдето > изтеглянето по-нататък се нарича TMemoryStream.SIZE :)Това е ясно, но как да определим след аварийно рестартиране на програмата колко секции са изтеглени и колко са изтеглени във всяка сесия? Оказва се, че е необходимо някъде отделно да се съхранява информация за броя и началото и обема на всеки раздел.
Това е ясно, но как да определим след спешно рестартиране на програмата колко раздела са изтеглени и колко са изтеглени във всяка сесия? Оказва се, че е необходимо да се съхранява някъде отделно информация за номера и началото и обема на всеки раздел.
←→FireMan_Alexey ( 2009-02-04 15:28 ) [36]
И Download Master също има *.dfmr файл :)
Така че трябва да запазите тази информация
> И Download Master също има *.dfmr файл :)Доколкото знам, DM пише информация за секциите в края на файла, който тегли.
←→FireMan_Alexey ( 2009-02-05 03:38 ) [39]
Не сега Но беше :), по стар спомен :)