![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 63
|
Допустим мы создаем поток URLStream и начинаем загружать в него данные
в какой-то момент времени, когда данные еще не полностью загружены мы вызываем функцию close() для того чтобы приостановить загрузку, предворительно сохранив загруженные данные в массив Возникает вопрос, возможно ли возобновить загрузку не считывая повторно данные сохраненные в tmpByteArray? |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
гуглить по "flash HTTP-streaming", "flash эмуляция потокового видео через HTTP".
Вот, например, на первой жк странице http://crocodile2u.habrahabr.ru/blog/30402/. Другого способа (без программирования на сервере) - нет. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 63
|
это не то
мне не нужна потоковая загрузка видео задача в том чтобы закачивать файлы любого типа (сейчас для меня актуальны изображения) если часть его была закачана, то нужно возобновить загрузку с того места где загрузка была приостановлена. |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Цитата:
![]() Вам нужно передавать заголовок Range c содержимым "bytes=байт_с_которого_качать-". Далее начинать закачку и, например, каждый PROGRESS читать из потока количество байт, равное URLStream.bytesAvaliable, и дописывать их в конец tmpByteArray. |
|
|||||
|
Регистрация: Jan 2009
Сообщений: 1,651
|
2mrMEM:
Обычно такие вопросы возникают с видео, поэтому и давал соответсвующую инфу. В общем случае: Чтобы сервер знал, что данные нужно отдавать не с начала, а с определенной позиции - нужно серверу передать с какой позиции передавать данные. на сервере тогда должен быть код, например php-код, что-то типа: $start = (int) filter_input(INPUT_GET, 'position', FILTER_VALIDATE_INT);
$fname = $_GET["fname"];
if ($start < 0) die("Incorrect request");
// open file for reading
$fp = fopen($fname, 'r');
$fsize = filesize($file);
if ($start > 0)
{
// seek to requested position
fseek($fp, $start);
header("Content-Length: " . (strlen($header) + $fsize - $start));
} else {
header("Content-Length: " . $fsize);
}
while(!feof($fp)) {
print(fread($fp, 1024));
}
fclose($fp);
|
|
|||||
|
Регистрация: Feb 2009
Сообщений: 63
|
SamFR, куда передавать заголовок Range?
iflamberg, я правильно понимаю, что без PHP здесь не обойтись? |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Конечно, всё зависит от серверной реализации, но стандарт HTTP/1.1 диктует именно такой способ получения частичного содержимого – с помощью заголовков Range и Content-Range. И большинство серверов, поддерживающих докачку (то есть выдачу частичного содержимого), реализуют именно этот стандарт.
Добавлено через 3 минуты Заголовок Range передавать в запросе серверу. См. URLRequest.requestHeaders и класс URLRequestHeader. В ответе вам придёт заголовок Content-Range, указывающий, какой диапазон данных сервак будет отдавать. В некоторых случаях (хотя очень редко) он может не совпадать с тем, что вы запросили в Range. Но, опять же повторюсь, сервак должен поддерживать этот способ закачки (то есть в ответе выдавать заголовок Accept-Ranges). Добавлено через 6 минут Также советую почитать спецификацию HTTP/1.1 или (даже лучше) статью Википедии про HTTP (http://ru.wikipedia.org/wiki/HTTP), а конкретно её раздел "Докачка и фрагментарное скачивание". Там всё очень подробно разжёвано. Последний раз редактировалось SamFR; 18.11.2009 в 19:22. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 63
|
с URLRequest должен разобраться, спасибо
а как я могу узнать, что сервер поддерживает этот способ закачки? вопрос состоит во-первых в том, чтобы как правильно выбрать сервер под эти нужды, а во-вторых, могу ли я узнать об этом програмно, быть может try мне поможет? |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Цитата:
![]() try тут не при чём. Добавлено через 14 минут Боюсь только, что определить это вы сможете только из-под AIR, если речь идёт о флэше. Сейчас посмотрел – событие httpResponseStatus объекта URLStream доступно только для эйра. Как и свойство HTTPStatusEvent.responseHeaders. Где тут угроза безопасности – не знаю, но факт остаётся фактом. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 63
|
чтобы реализовать докачку, делаю так:
resumeUrl = new URLRequest(url.url); // создаем новый запрос с адресом старого запроса var urlRequestHeader:URLRequestHeader = new URLRequestHeader("Range", "bytes="+byteArray.length); // просим качать с конкретного места resumeUrl.requestHeaders.push(urlRequestHeader); try { stream.load(resumeUrl); } catch (err2:Error){ // если не получается качать с заданного места, качаем с начала try { stream.load(url); } catch (err2:Error){ trace(err2); } trace(err2); } http://reditstudio.ru/tmp/Test.swf, проверяю докачку, запрос работает, но данные не верно интерпретируются при переводе в графический вид. подозреваю, что параметр byteArray.length неправильный. byteArray - массив, в который заливаются данные из потока. это происходит так: |
![]() |
![]() |
Часовой пояс GMT +4, время: 00:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|