![]() |
можно ли загружать данные в URLStream с конкретного места?
Допустим мы создаем поток URLStream и начинаем загружать в него данные
в какой-то момент времени, когда данные еще не полностью загружены мы вызываем функцию close() для того чтобы приостановить загрузку, предворительно сохранив загруженные данные в массив Код AS3:
|
гуглить по "flash HTTP-streaming", "flash эмуляция потокового видео через HTTP".
Вот, например, на первой жк странице http://crocodile2u.habrahabr.ru/blog/30402/. Другого способа (без программирования на сервере) - нет. |
это не то
мне не нужна потоковая загрузка видео задача в том чтобы закачивать файлы любого типа (сейчас для меня актуальны изображения) если часть его была закачана, то нужно возобновить загрузку с того места где загрузка была приостановлена. |
Цитата:
Вам нужно передавать заголовок Range c содержимым "bytes=байт_с_которого_качать-". Далее начинать закачку и, например, каждый PROGRESS читать из потока количество байт, равное URLStream.bytesAvaliable, и дописывать их в конец tmpByteArray. |
2mrMEM:
Обычно такие вопросы возникают с видео, поэтому и давал соответсвующую инфу. В общем случае: Чтобы сервер знал, что данные нужно отдавать не с начала, а с определенной позиции - нужно серверу передать с какой позиции передавать данные. на сервере тогда должен быть код, например php-код, что-то типа: Код:
$start = (int) filter_input(INPUT_GET, 'position', FILTER_VALIDATE_INT); |
SamFR, куда передавать заголовок Range?
iflamberg, я правильно понимаю, что без PHP здесь не обойтись? |
Конечно, всё зависит от серверной реализации, но стандарт 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), а конкретно её раздел "Докачка и фрагментарное скачивание". Там всё очень подробно разжёвано. |
с URLRequest должен разобраться, спасибо
а как я могу узнать, что сервер поддерживает этот способ закачки? вопрос состоит во-первых в том, чтобы как правильно выбрать сервер под эти нужды, а во-вторых, могу ли я узнать об этом програмно, быть может try мне поможет? |
Цитата:
try тут не при чём. Добавлено через 14 минут Боюсь только, что определить это вы сможете только из-под AIR, если речь идёт о флэше. Сейчас посмотрел – событие httpResponseStatus объекта URLStream доступно только для эйра. Как и свойство HTTPStatusEvent.responseHeaders. Где тут угроза безопасности – не знаю, но факт остаётся фактом. |
чтобы реализовать докачку, делаю так:
Код AS3:
http://reditstudio.ru/tmp/Test.swf, проверяю докачку, запрос работает, но данные не верно интерпретируются при переводе в графический вид. подозреваю, что параметр byteArray.length неправильный. byteArray - массив, в который заливаются данные из потока. это происходит так: Код AS3:
|
А без докачки работает?
Код AS3:
Кстати, у вас может не получаться по следующей причине: ваш сервак просто не поддерживает докачку. Хоть это и маловероятно, но такой вариант всё-же имеется. Дело в том, что в этом случае ваш try..catch не сработает. Все пройдёт без ошибок, но данные начнут отдаваться с начала файла, как если бы вы не отправляли заголовка Range. Узнать, поддерживает ли сервак докачку, можно только просмотрев ответные заголовки (в них должен присутствовать заголовок Accept-Ranges). К сожалению, из-под FP это сделать нельзя, только из-под AIR. Поэтому, попробуйте с текстовым файлом и посмотрите, что получится. А также советую посмотреть диалог флешки с серваком тем же FireBug-ом. Заодно увидите, отправляет ли сервак Accept-Ranges, а также отправляет ли флешка Range. Добавлено через 24 минуты Вот ещё что. Подпишитесь-ка на событие HTTPStatusEvent.HTTP_STATUS вашего экземпляра URLStream, и в обработчике протрейсите Код AS3:
Если после запроса, содержащего Range, статус-код равен 200, то сервак докачку не поддерживает. Если же он равен 206, что указывает на выдачу частичного содержимого, то всё нормально и проблема, скорее всего, в чём-то другом. Добавлено через 32 минуты Цитата:
Из-под флеш-плеера докачку реализовывать не приходилось, но из-под AIR проблем особых не возникло. К счастью, статус-код можно посмотреть и из флеш-плеера, поэтому тут тоже проблем быть не должно, хоть и будет чуть менее надёжно без анализа ответных заголовков. |
up message
Добавлено через 27 минут Цитата:
Цитата:
кстати событие HTTPStatusEvent.HTTP_STATUS почему-то срабатывает после закачки.. SamFR, спасибо за дельные советы |
Цитата:
Цитата:
Цитата:
|
| Часовой пояс GMT +4, время: 06:16. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.