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

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

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

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Question Скаченный файл отличается от оригинала(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));
		}
 
}}
__________________
uglan

Старый 14.11.2013, 22:28
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 2  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Это нафига устанавливать? По дефолту булеан и так 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();
Вы не ищете легких путей.

Может по прогрессу просто писать в буфер, а потом в файл, а по комплиту закрывать файлстрим? Я бы так сделал.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Цитата:
Сообщение от dimarik Посмотреть сообщение
Может по прогрессу просто писать в буфер, а потом в файл, а по комплиту закрывать файлстрим? Я бы так сделал.
Если файл большой(а это так) то он сжирает под себя много памяти и я нервничаю. То есть кроме этих недочетов ничего подозрительного нет? А ведь где-то он косячит и недогружает байты... Я нашел в этом систему закачанный файл всегда меньше оригинала на 286 байтов... Что за мистика?
__________________
uglan

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Да ладно. А что будет, если onProgressEvent придет раньше, чем waitingForDataToWrite будет равно true. Тут уже я начинаю нервничать.

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

Старый 14.11.2013, 23:08
uglan вне форума Посмотреть профиль Отправить личное сообщение для uglan Посетить домашнюю страницу uglan Найти все сообщения от uglan
  № 5  
Ответить с цитированием
uglan

Регистрация: Mar 2003
Адрес: moscow
Сообщений: 102
Отправить сообщение для uglan с помощью ICQ Отправить сообщение для uglan с помощью Skype™
Цитата:
Сообщение от dimarik Посмотреть сообщение
URLStream вроде бы представляет собой буфер текущей пачки данных. На следующий прогресс эти данные вроде как заменяются новыми.
И последняя пачка в 286 байт почему-то не доходит. Осталось понять почему...

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

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

Теги
file , URLStream
Опции темы
Опции просмотра

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

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


 


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


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