Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Каким способом лучше загружать медиа-файлы с сервера? (http://www.flasher.ru/forum/showthread.php?t=183022)

Astraport 09.08.2012 16:34

Каким способом лучше загружать медиа-файлы с сервера?
 
Как известно 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>


Krusty 09.08.2012 17:53

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

alatar 09.08.2012 18:08

Цитата:

Можно ли как-то проверять контрольную сумму файлов?
Проверить контрольную сумму, например, md5.

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

P.S. URLLoader не поддерживает докачку, что может стать проблемой при более-менее значительном размере доп. файлов.

Astraport 09.08.2012 18:18

Спасибо. Все же не ясно практическая сторона проверки контрольной суммы для zip. Нет ли примеров кода?

Добавлено через 1 минуту
Цитата:

В случае с Google Play свои файлы можно разместить и в маркете.
Чем это может быть полезно кроме сохранения места на своем сервере и возможной недоступности своих серверов?

alatar 09.08.2012 18:24

Цитата:

Все же не ясно практическая сторона проверки контрольной суммы для zip.
Приложение должно, каким либо образом, знать md5 хэш файла. Это простая строка. После загрузки файла считается его md5 хэш, например с помощью as3corelib. Полученная строка сравнивается с уже известной.

Добавлено через 11 минут
Цитата:

Чем это может быть полезно кроме сохранения места на своем сервере и возможной недоступности своих серверов?
А какие вам еще преимущества нужны? Можно добавить более широкие каналы, региональное кеширование и то что пользователь в маркете будет видеть реальный размер приложения вместе с доп. контентом.

Astraport 09.08.2012 23:00

Проверил - загрузка архива и проверка по MD5 работает на Андроидах точно, позднее на iOS проверю.

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

alatar 09.08.2012 23:11

Это не зависит от операционки. О загрузке отдельных файлов и речи не идет. Помимо архива картинки можно объеденить в атласы.

Astraport 09.08.2012 23:14

Цитата:

Это не зависит от операционки.
В iOS все же безопасность на более высоком уровне.
Цитата:

О загрузке отдельных файлов и речи не идет.
В смысле? Забыть эту бредовую идею?
Цитата:

Помимо архива картинки можно объеденить в атласы.
Нет, мне этот вариант не подходит:)

alatar 09.08.2012 23:17

Цитата:

В iOS все же безопасность на более высоком уровне.
При чем тут безопасность?
Цитата:

В смысле? Забыть эту бредовую идею?
Если файлов много, то забыть.

Astraport 09.08.2012 23:19

Цитата:

При чем тут безопасность?
Боюсь, что не даст распаковать архив или ещё что.

alatar 10.08.2012 00:16

Не бойся.


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

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