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

Вернуться   Форум Flasher.ru > Flash > Flash Приложения: AIR, Zinc и тд.

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Каким способом лучше загружать медиа-файлы с сервера?

Как известно AIR мобильные приложения желательно делать размерами до 20 Мб в запакованном виде. Это не всегда удается и поэтому единственное решение - загружать контент юзером после установки приложения.

Я планирую использовать URLStream, но мне кажется, что того же можно достичь как минимум ещё 3 способами: URLLoader напрямую обращаясь к файлам, URLLoader который дергает PHP-скрипт, который возвращает контент и FileReference. Скажите какой способ лучше использовать?

Вторая проблема - это необходимость все делать асинхронно, что приводит к увеличении времени загрузки, особенно если файлов десятки и сотни. Вот пример моего приложения, которое проверяет есть ли у юзера нужные файлы и, если нет, то загружает их. Все работает, но мне не нравится (по сути *****код).

Есть возможность поставлять контент в виде zip-архивов, но почему-то не доверяю этому методу из-за возможных ошибок при распаковке. Можно ли как-то проверять контрольную сумму файлов? Не нашел как это можно сделать.

Код AS3:
[Bindable] public var backEffectsAC:ArrayCollection = new ArrayCollection([
{name:'Pad track', tip: 'loop', periodicity:2, used: true, path:['sounds/11.mp3','sounds/12.mp3','sounds/13.mp3'], level:8}, 
{name:'Key track', tip: 'loop', periodicity:2, used: true, path:['sounds/21.mp3','sounds/22.mp3','sounds/23.mp3'], level:8}, 
{name:'Atmosphere', tip: 'loop', periodicity:2, used: true, path:['sounds/31.mp3','sounds/32.mp3','sounds/33.mp3'], level:8},
{name:'Priboi', tip: 'fx', periodicity:2, used: true, path:'sounds/4.mp3', level:8}, 
{name:'Sitar', tip: 'fx', periodicity:2, used: true, path:'sounds/5.mp3', level:8},
{name:'Gitar', tip: 'fx', periodicity:2, used: true, path:'sounds/6.mp3', level:8}, 
{name:'Percusion', tip: 'fx', periodicity:2, used: true, path:'sounds/7.mp3', level:8},
{name:'Priboi', tip: 'fx', periodicity:2, used: true, path:'sounds/8.mp3', level:8}, 
{name:'Sitar', tip: 'fx', periodicity:2, used: true, path:'sounds/9.mp3', level:8},
{name:'Gitar', tip: 'fx', periodicity:2, used: true, path:'sounds/10.mp3', level:8}
]);
private var fileCount:int;
private var arrayCount:int;
private var fileName:String;
 
private var urlStream:URLStream;  
private var fileStream:FileStream;
private var fileData:ByteArray = new ByteArray(); 
 
			protected function creationCompleteHandler(event:FlexEvent):void
			{
				var file:File = File.applicationStorageDirectory.resolvePath("sounds/7.mp3");
				if (!file.exists) {
					alert.open(this, false);
					updateAlertPosition(alert);
					fileCount = 0;
					arrayCount = 0;
					downloadNow();
				}
			}
 
			private function downloadNow():void
			{
					if (backEffectsAC.getItemAt(fileCount).path is Array){
						var tempArray:Array =backEffectsAC.getItemAt(fileCount).path;
						if (arrayCount > tempArray.length-1){
							arrayCount = 0;
							fileCount ++;
							if (fileCount >= backEffectsAC.length){
								alert.close();
								alertShow("Files downloaded succesfully") ;
								return;
							}
							downloadNow();
						} else {
							fileCount --;
							fileName = String(tempArray[arrayCount]).slice(7);
							arrayCount++;
							getFileRemote(fileName);
						}
					} else {
						fileName = String(backEffectsAC.getItemAt(fileCount).path).slice(7);
						getFileRemote(fileName);
					}
			}
 
 
			private function updateAlertPosition(wnd:SkinnablePopUpContainer):void
			{
				if (wnd.isOpen) {
					wnd.width = systemManager.screen.width;
					wnd.height = systemManager.screen.height;
				}
			}
 
			public function getFileRemote(pathRemote:String):void  
			{  
				urlStream = new URLStream();
				var urlReq:URLRequest = new URLRequest('http://mysite.com/downloads/sounds/' + pathRemote); 
				urlStream.addEventListener(Event.COMPLETE, loaded);  
				urlStream.load (urlReq);
			}  
 
			private function loaded(event:Event):void  
			{  
				urlStream.removeEventListener(Event.COMPLETE, loaded);
				urlStream.readBytes (fileData, 0, urlStream.bytesAvailable);  
				resolveFile(fileName);  
			}  
 
			private function resolveFile(pathLocal:String):void  
			{  
				var fileLocal:File = File.applicationStorageDirectory.resolvePath('sounds/' + pathLocal);  
				fileStream = new FileStream();  
				fileStream.addEventListener(Event.CLOSE, fileClosed);  
				fileStream.openAsync(fileLocal, FileMode.WRITE);  
				fileStream.writeBytes(fileData, 0, fileData.length);  
				fileStream.close();  
			}  
 
			private function fileClosed(event:Event):void  
			{  
				fileStream.removeEventListener(Event.CLOSE, fileClosed);  
				fileCount ++;
				if (fileCount >= backEffectsAC.length){
					alert.close();
					alertShow("Files downloaded succesfully") ;
					return;
				}
				downloadNow();
			} 
 
			protected function alert1_ok_clickHandler(event:MouseEvent):void
			{
				alert1.close();
			}
 
			protected function alertShow(txt:String):void
			{
				alert1.open(this, false);
				labelTxt.text = txt;
				updateAlertPosition(alert1);
			}
		]]>
	</fx:Script>
	<fx:Declarations>
		<s:SkinnablePopUpContainer id="alert" backgroundAlpha="0.5" backgroundColor="0x000000">
			<s:Panel title="Loading" horizontalCenter="0" verticalCenter="0" width="50%" height="50%">
				<s:VGroup gap="10" verticalAlign="middle" horizontalAlign="center" width="100%" height="100%">
					<s:BusyIndicator />
					<s:Label width="100%" height="100%" fontSize ="24" textAlign="center" text="Wait please..."/>
				</s:VGroup>
			</s:Panel>
		</s:SkinnablePopUpContainer>
		<s:SkinnablePopUpContainer id="alert1" backgroundAlpha="0.5" backgroundColor="0x000000">
			<s:Panel title="Error" horizontalCenter="0" verticalCenter="0" width="50%" height="50%">
				<s:VGroup gap="10" verticalAlign="middle" horizontalAlign="center" width="100%" height="100%">
					<s:Label id="labelTxt" width="100%" height="100%" fontSize ="24" textAlign="center"/>
					<s:HGroup width="100%" bottom="0" horizontalAlign="center">
						<s:Button label="OK" click="alert1_ok_clickHandler(event)" width="50%" styleName="dialogDefaultButton"/>
					</s:HGroup>
				</s:VGroup>
			</s:Panel>
		</s:SkinnablePopUpContainer>
	</fx:Declarations>
__________________
In Code We Trust

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

Регистрация: Jul 2007
Сообщений: 393
Я использую md5 у файла плюс xml с соответствием файл-его мд5 проверка(хотя сие избыточно, можно и json обойтись). Результирующий файл тоже мд5 подписываю.

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Можно ли как-то проверять контрольную сумму файлов?
Проверить контрольную сумму, например, md5.

В случае с Google Play свои файлы можно разместить и в маркете.

P.S. URLLoader не поддерживает докачку, что может стать проблемой при более-менее значительном размере доп. файлов.
__________________
משיח לא בא
משיח גם לא מטלפן

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Спасибо. Все же не ясно практическая сторона проверки контрольной суммы для zip. Нет ли примеров кода?

Добавлено через 1 минуту
Цитата:
В случае с Google Play свои файлы можно разместить и в маркете.
Чем это может быть полезно кроме сохранения места на своем сервере и возможной недоступности своих серверов?
__________________
In Code We Trust

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Все же не ясно практическая сторона проверки контрольной суммы для zip.
Приложение должно, каким либо образом, знать md5 хэш файла. Это простая строка. После загрузки файла считается его md5 хэш, например с помощью as3corelib. Полученная строка сравнивается с уже известной.

Добавлено через 11 минут
Цитата:
Чем это может быть полезно кроме сохранения места на своем сервере и возможной недоступности своих серверов?
А какие вам еще преимущества нужны? Можно добавить более широкие каналы, региональное кеширование и то что пользователь в маркете будет видеть реальный размер приложения вместе с доп. контентом.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 09.08.2012, 23:00
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 6  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Проверил - загрузка архива и проверка по MD5 работает на Андроидах точно, позднее на iOS проверю.

А как поступить если контрольная сумма не сходится? Предложить перекачать? Часто ли бывают ошибки?
Это я к тому, что не хочется юзеров оплативших аппу заставлять совершать дополнительные движения и нервничать. Способ должен быть надежным.
Все равно мне кажется, что проще и надежнее загрузить и распаковать один zip-архив c сотней картинок, чем асинхронно грузить их по отдельности.
__________________
In Code We Trust

Старый 09.08.2012, 23:11
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 7  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Это не зависит от операционки. О загрузке отдельных файлов и речи не идет. Помимо архива картинки можно объеденить в атласы.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 09.08.2012, 23:14
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 8  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
Это не зависит от операционки.
В iOS все же безопасность на более высоком уровне.
Цитата:
О загрузке отдельных файлов и речи не идет.
В смысле? Забыть эту бредовую идею?
Цитата:
Помимо архива картинки можно объеденить в атласы.
Нет, мне этот вариант не подходит
__________________
In Code We Trust

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

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
В iOS все же безопасность на более высоком уровне.
При чем тут безопасность?
Цитата:
В смысле? Забыть эту бредовую идею?
Если файлов много, то забыть.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 09.08.2012, 23:19
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 10  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Цитата:
При чем тут безопасность?
Боюсь, что не даст распаковать архив или ещё что.
__________________
In Code We Trust

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

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

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


 


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


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