Цитата:
Сообщение от HorusWM
Сделал через обмен данными с сервером: ссылка на фото отправляется ему, он возвращает массив байт, описывающих изображение. Тему можно закрывать.
|
А можно глянуть серверный код который это делает?
Чтобы свой велосипед не изобретать, когда это понадобится
Добавлено через 1 час 34 минуты
Таки сделал велосипед ) Может кому пригодится
Используется 2 класса на клиенте, и небольшой скрипт на сервере
Основной, универсальный пакет для запросов к серверу:

Код AS3:
package client {
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import flash.utils.ByteArray;
public class Packet {
public static const HOST: String = "http://hostname.com/";
public static const SCRIPT: String = "call.php";
public static var USER_ID: String = "userId";
public static var PASSWORD: String = "pass";
private var _callback: Function = null;
private var _isBinary: Boolean = false;
/**
*
* @param method имя метода для передачи в параметр method на сервер
* @param callback вызывается когда в ответ на запрос приходят данные
* в случае ошибки игнорируется
*/
public function Packet(method:String, callback:Function, params:Object = null, isBinary:Boolean = false) {
_callback = callback;
_isBinary = isBinary;
var loader: URLLoader = new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
if (!_isBinary) {
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
} else {
loader.dataFormat = URLLoaderDataFormat.BINARY;
}
var vars:URLVariables = new URLVariables();
vars['method'] = method;
vars['pass'] = PASSWORD;
vars['userId'] = USER_ID;
if (params != null) {
for (var i:String in params) {
vars[i] = params[i];
}
}
var rand: String = "?" + int(Math.random() * 100000);
var request:URLRequest = new URLRequest(Packet.HOST + Packet.SCRIPT + rand);
request.method = URLRequestMethod.POST;
request.data = vars;
trace(request.data.toString());
try {
loader.load(request);
} catch (e:Error) {
trace(e.getStackTrace());
}
}
private function onSecurityError(e:SecurityErrorEvent):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
}
private function onIOError(e:IOErrorEvent):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
}
private function onComplete(e:Event):void {
e.target.removeEventListener(Event.COMPLETE, onComplete);
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
if (!_isBinary) {
var data:Object = e.target.data as Object;
if (_callback != null) {
_callback.call(null, data);
}
} else {
var byteArray:ByteArray = e.target.data as ByteArray;
if (_callback != null) {
_callback.call(null, byteArray);
}
}
}
}
}
Вспомогательный пакет для загрузки изображения:

Код AS3:
package client {
import flash.display.Bitmap;
import flash.display.Loader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.utils.ByteArray;
import flash.system.LoaderContext;
/**
* загружает картинку с любого домена,
* через отправку запроса своему серверу
* и получение этой картинки уже от него
*/
public class ProxiedImage {
private var _callback: Function = null;
/**
* @param imageUrl прямая ссылка на картинку
* @param callback метод с единственным параметром image:Bitmap
*/
public function ProxiedImage(imageUrl:String, callback:Function) {
_callback = callback;
if (_callback == null) {
throw new ArgumentError("callback cannot be null!");
}
var packet:Packet = new Packet("getImage", onLoad, { url: imageUrl }, true);
}
private function onLoad(params:Object):void {
if (_callback == null) return;
var imageBytes: ByteArray = params as ByteArray;
var loader: Loader = new Loader();
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
try {
var context:LoaderContext = new LoaderContext(true);
loader.loadBytes(imageBytes, context);
} catch (e:Error) {
loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
}
}
private function onComplete(e:Event):void {
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(Event.COMPLETE, onComplete);
var image:Bitmap = e.target.content as Bitmap;
_callback.call(null, image);
}
private function onIOError(e:IOErrorEvent):void {
e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError);
e.target.removeEventListener(Event.COMPLETE, onComplete);
}
}
}
Ну и php скрипт, который грузит картинку и возвращает байты

PHP код:
$method = $_POST['method'];
if ($method == "getImage") {
$url = $_POST['url'];
$url_reg = "/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/";
if (preg_match($url_reg, $url)) {
$file = file_get_contents($url);
echo $file;
}
}
Используется все просто.
там, где надо загрузить картинку с другого домена, создаем метод, в который будет возвращаться картинка:

Код AS3:
private function onImageLoaded(image:Bitmap):void {
addChild(image); // вуаля, картинка добавлена
}
и отправляем запрос на загрузку картинки серверу

Код AS3:
var pi:ProxiedImage = new ProxiedImage("http://example.com/image.jpg", onImageLoaded);
Все, после загрузки картинка передастся как аргумент созданному методу