Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Скаченный файл отличается от оригинала(URLStream) (http://www.flasher.ru/forum/showthread.php?t=204940)

uglan 14.11.2013 22:01

Скаченный файл отличается от оригинала(URLStream)
 
Скачиваю файл с помощью URLStream, а на выходе размеры изначального файла и скаченного отличаются. Например, 22,526,758 bytes -VS- 22,527,070 bytes... Визуально вроде ничего не меняется, но вот с видеоролики страдают(что-то с ключевыми точками). Да и вообще, почему так происходит и как это лечить?

Ниже код качателя:
Код AS3:

package {
        import flash.events.DataEvent;
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.OutputProgressEvent;
        import flash.events.ProgressEvent;
        import flash.filesystem.File;
        import flash.filesystem.FileMode;
        import flash.filesystem.FileStream;
        import flash.net.URLRequest;
        import flash.net.URLStream;
        import flash.utils.ByteArray;
 
        public class Downloader extends EventDispatcher
        {
                [Event(name = "DownloadComplete",type = "DownloadEvent")]
 
                private var file:File;
                private var fileStream:FileStream;
                private var url:String;
                private var urlStream:URLStream;
 
                private var waitingForDataToWrite:Boolean = false;
 
                public function Downloader()
                {
                        urlStream = new URLStream();
 
                        urlStream.addEventListener(Event.OPEN, onOpenEvent);
                        urlStream.addEventListener(ProgressEvent.PROGRESS, onProgressEvent);
                        urlStream.addEventListener(Event.COMPLETE, onCompleteEvent);
 
                        fileStream = new FileStream();
                        fileStream.addEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler);
 
                }
 
                public function download(formUrl:String, toFile:File):void
                {
                        this.url = formUrl;
                        this.file = toFile;
                        fileStream.openAsync(file, FileMode.WRITE);
                        urlStream.load(new URLRequest(url));
                }
 
                private function onOpenEvent(event:Event):void
                {
                        waitingForDataToWrite = true;
 
                        dispatchEvent(event.clone());
                }
 
                private function onProgressEvent(event:ProgressEvent):void
                {
                        if (waitingForDataToWrite)
                        {
                                writeToDisk();
                                dispatchEvent(event.clone());
                        }
                }
 
                private function writeToDisk():void
                {
                        var fileData:ByteArray = new ByteArray();
                        trace(urlStream.bytesAvailable);
                        urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
                        fileStream.writeBytes(fileData,0,fileData.length);
                        waitingForDataToWrite = false;
 
                        dispatchEvent(new DataEvent(DataEvent.DATA));
                }
 
                private function writeProgressHandler(evt:OutputProgressEvent):void
                {
                        waitingForDataToWrite = true;
                }
 
                private function onCompleteEvent(event:Event):void
                {
                        if (urlStream.bytesAvailable > 0)
                        {
                                writeToDisk();
                        }
                        fileStream.close();
 
                        fileStream.removeEventListener(OutputProgressEvent.OUTPUT_PROGRESS, writeProgressHandler);
 
                        dispatchEvent(event.clone());
                        // dispatch additional DownloadEvent
                        dispatchEvent(new DownloadEvent(DownloadEvent.DOWNLOAD_COMPLETE, url, file));
                }
 
}}


dimarik 14.11.2013 22:28

Это нафига устанавливать? По дефолту булеан и так false. А объявление тратит присвоение в байтоде. Это касается всех типов.

Код AS3:

private var waitingForDataToWrite:Boolean = false;

А это работает в объявлении класса? Я просто привык это видеть на "уровне пакета".

Код AS3:

public class Downloader extends EventDispatcher
{
        [Event(name = "DownloadComplete",type = "DownloadEvent")]

Это лишнее. Оно само клонируется, если у event есть target.
Код AS3:

dispatchEvent(event.clone());

Похоже, вам проще было отекстендиться от URLStream, чем решать это композицией. Но это уже мое субъективное мнение.

Зачем каждый раз создавать такую штуку?
Код AS3:

var fileData:ByteArray = new ByteArray();

Вы не ищете легких путей.

Может по прогрессу просто писать в буфер, а потом в файл, а по комплиту закрывать файлстрим? Я бы так сделал.

uglan 14.11.2013 22:35

Цитата:

Сообщение от dimarik (Сообщение 1152432)
Может по прогрессу просто писать в буфер, а потом в файл, а по комплиту закрывать файлстрим? Я бы так сделал.

Если файл большой(а это так) то он сжирает под себя много памяти и я нервничаю. То есть кроме этих недочетов ничего подозрительного нет? А ведь где-то он косячит и недогружает байты... Я нашел в этом систему закачанный файл всегда меньше оригинала на 286 байтов... Что за мистика?

dimarik 14.11.2013 22:44

Да ладно. А что будет, если onProgressEvent придет раньше, чем waitingForDataToWrite будет равно true. Тут уже я начинаю нервничать.

Добавлено через 3 минуты
URLStream вроде бы представляет собой буфер текущей пачки данных. На следующий прогресс эти данные вроде как заменяются новыми.

uglan 14.11.2013 23:08

Цитата:

Сообщение от dimarik (Сообщение 1152444)
URLStream вроде бы представляет собой буфер текущей пачки данных. На следующий прогресс эти данные вроде как заменяются новыми.

И последняя пачка в 286 байт почему-то не доходит. Осталось понять почему...

Добавлено через 47 часов 57 минут
Новости! Новости! Как я не лопатил код, ничего толкового не выходило, и тут я решил проверить сколько же весит файл на сервере. Какого было мое удивление, когда я обнаружил что файл там весит столько же сколько скачивается на компьютер через флеш. То есть с кодом все в порядке и он скачивает именно столько сколько лежит на сервере. Вопрос в том почему когда я скачиваю ФТП клиентом или просто по ссылке файл становится больше на 286 байт и обратно когда я заливаю его на сервер он становится на 286 байт меньше. Что за магия такая?! Кто с таким сталкивался? Ничего не понимаю...


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

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