Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.11.2009, 17:14
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 1  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
По умолчанию можно ли загружать данные в URLStream с конкретного места?

Допустим мы создаем поток URLStream и начинаем загружать в него данные
в какой-то момент времени, когда данные еще не полностью загружены мы вызываем функцию close() для того чтобы приостановить загрузку, предворительно сохранив загруженные данные в массив
Код AS3:
var stream:URLStream = new URLStream();
var tmpByteArray:ByteArray = new ByteArray();
stream.load(url);
...
srteam.readBytes(tmpByteArray);
stream.colse();
Возникает вопрос, возможно ли возобновить загрузку не считывая повторно данные сохраненные в tmpByteArray?

Старый 18.11.2009, 17:52
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 2  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: Jan 2009
Сообщений: 1,651
гуглить по "flash HTTP-streaming", "flash эмуляция потокового видео через HTTP".
Вот, например, на первой жк странице http://crocodile2u.habrahabr.ru/blog/30402/.

Другого способа (без программирования на сервере) - нет.

Старый 18.11.2009, 18:22
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 3  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
это не то
мне не нужна потоковая загрузка видео
задача в том чтобы закачивать файлы любого типа (сейчас для меня актуальны изображения)
если часть его была закачана, то нужно возобновить загрузку с того места где загрузка была приостановлена.

Старый 18.11.2009, 18:37
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 4  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Цитата:
Сообщение от mrMEM Посмотреть сообщение
Возникает вопрос, возможно ли возобновить загрузку не считывая повторно данные сохраненные в tmpByteArray?
Вам и не нужно их повторно считывать, вам нужно дописывать в tmpByteArray вновь пришедшие данные. Я ж вам писал в прошлой вашей теме

Вам нужно передавать заголовок Range c содержимым "bytes=байт_с_которого_качать-". Далее начинать закачку и, например, каждый PROGRESS читать из потока количество байт, равное URLStream.bytesAvaliable, и дописывать их в конец tmpByteArray.

Старый 18.11.2009, 18:57
iflamberg вне форума Посмотреть профиль Отправить личное сообщение для iflamberg Найти все сообщения от iflamberg
  № 5  
Ответить с цитированием
iflamberg
 
Аватар для iflamberg

Регистрация: 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);
а url для загрузки должен быть соответственно что-то типа "get.php?fname=pic.jpg&position=1000"

Старый 18.11.2009, 19:12
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 6  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
SamFR, куда передавать заголовок Range?
iflamberg, я правильно понимаю, что без PHP здесь не обойтись?

Старый 18.11.2009, 19:13
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 7  
Ответить с цитированием
SamFR

Регистрация: 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.
Старый 18.11.2009, 19:23
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 8  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
с URLRequest должен разобраться, спасибо

а как я могу узнать, что сервер поддерживает этот способ закачки?
вопрос состоит во-первых в том, чтобы как правильно выбрать сервер под эти нужды,
а во-вторых, могу ли я узнать об этом програмно, быть может try мне поможет?

Старый 18.11.2009, 19:27
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 9  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Цитата:
Сообщение от SamFR Посмотреть сообщение
Но, опять же повторюсь, сервак должен поддерживать этот способ закачки (то есть в ответе выдавать заголовок Accept-Ranges).
И статью я вам не просто так порекомендовал

try тут не при чём.

Добавлено через 14 минут
Боюсь только, что определить это вы сможете только из-под AIR, если речь идёт о флэше. Сейчас посмотрел – событие httpResponseStatus объекта URLStream доступно только для эйра. Как и свойство HTTPStatusEvent.responseHeaders.

Где тут угроза безопасности – не знаю, но факт остаётся фактом.

Старый 20.11.2009, 18:12
mrMEM вне форума Посмотреть профиль Отправить личное сообщение для mrMEM Найти все сообщения от mrMEM
  № 10  
Ответить с цитированием
mrMEM

Регистрация: Feb 2009
Сообщений: 63
чтобы реализовать докачку, делаю так:
Код AS3:
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);
}
залил swf на сервер
http://reditstudio.ru/tmp/Test.swf,
проверяю докачку, запрос работает, но данные не верно интерпретируются при переводе в графический вид. подозреваю, что параметр byteArray.length неправильный.

byteArray - массив, в который заливаются данные из потока. это происходит так:

Код AS3:
private function streamProgressHandler(event:ProgressEvent){
	if( stream.bytesAvailable == 0 ) return;
	if (stream.connected){
		stream.readBytes(byteArray, byteArray.length);
	}
	trace(event);
 
	if (showLoading && timerFlag){
		timerFlag = false;
		loader.unload();
		loader.loadBytes(byteArray);
	}
 
}

Создать новую тему Ответ Часовой пояс GMT +4, время: 00:10.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 00:10.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.