#flash #actionscript-3
#flash #actionscript-3
Вопрос:
Я пытаюсь загрузить некоторые двоичные данные с сервера следующим образом
var urlRequest:URLRequest = new URLRequest("http://localhost/test.php");
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.load(urlRequest);
Но он всегда сообщает об ошибке:
Loader Error #2124: Loaded file is an unknown type
Мои двоичные данные — это пользовательские данные, а не swf / файл изображения. Flash не поддерживает загрузку таких данных? Или я должен использовать какой-то другой метод?
Комментарии:
1. Я уже получил ответ, следует использовать URLLoader вместо Loader.
2. Поскольку вы указали двоичные данные, вы можете рассмотреть сокеты для обработки двоичных данных. Рад, что вы решили проблему с загрузчиком URL.
Ответ №1:
Вам нужно использовать URLLoader и указать формат данных запроса:
var request:URLRequest = new URLRequest(url);
var urlLoader:URLLoader = new URLLoader(request);
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, onLoaded);
function onLoaded(e:Event):void {
var bytes:ByteArray = urlLoader.data;
}
Ответ №2:
Вы думали о реализации сокетов? Это даст вам больший контроль над двоичной сериализацией определенных типов данных.
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html
Пример кода, приведенный в документации Adobe:
package {
import flash.display.Sprite;
public class SocketExample extends Sprite {
private var socket:CustomSocket;
public function SocketExample() {
socket = new CustomSocket("localhost", 80);
}
}
}
import flash.errors.*;
import flash.events.*;
import flash.net.Socket;
class CustomSocket extends Socket {
private var response:String;
public function CustomSocket(host:String = null, port:uint = 0) {
super();
configureListeners();
if (host amp;amp; port) {
super.connect(host, port);
}
}
private function configureListeners():void {
addEventListener(Event.CLOSE, closeHandler);
addEventListener(Event.CONNECT, connectHandler);
addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
}
private function writeln(str:String):void {
str = "n";
try {
writeUTFBytes(str);
}
catch(e:IOError) {
trace(e);
}
}
private function sendRequest():void {
trace("sendRequest");
response = "";
writeln("GET /");
flush();
}
private function readResponse():void {
var str:String = readUTFBytes(bytesAvailable);
response = str;
}
private function closeHandler(event:Event):void {
trace("closeHandler: " event);
trace(response.toString());
}
private function connectHandler(event:Event):void {
trace("connectHandler: " event);
sendRequest();
}
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " event);
}
private function securityErrorHandler(event:SecurityErrorEvent):void {
trace("securityErrorHandler: " event);
}
private function socketDataHandler(event:ProgressEvent):void {
trace("socketDataHandler: " event);
readResponse();
}
}
Комментарии:
1. Причина, по которой мы используем http, заключается в том, что мы просто хотим снять большую нагрузку с сервера сокетов. Все равно спасибо!
Ответ №3:
Вам нужно использовать URLLoader
вместо Loader
. Потому что
Loader
объект полезен только для загрузки swfs и изображений. и
URLLoader
только для хранения двоичных данных или текстовых или двоичных данных.
Ответ №4:
Когда мне нужно отправить двоичные данные (изображения) с моего сервера (PHP) на Flash (Flex) Обычно я кодирую данные в 64-битном формате (кодировщик Base64), а затем я * де * кодирую их в Flex, используя класс Base64Decoder . Надеюсь, это вам поможет.